home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 2
/
Atari Mega Archive CD - Volume 2.iso
/
8bit
/
language
/
albug.crf
< prev
next >
Wrap
Text File
|
1995-04-22
|
90KB
|
1,914 lines
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 1
ALBUG.M65
1 ;<HESS.ATARI>ALBUG.M65.71 12-Mar-82 15:25:26, Edit by HESS
2
3 .TITLE LBUG - 6502 DEBUGGER (ATARI VERSION)
4 ; (C) Ted Hess, Hudson, Ma. 1977,1978,1979,1980,1981,1982
5
6 .LIST MB ;LIST BINARY IN MACROS
7 .NLIST TOC ;NO TABLE OF CONTENTS
8 .ENABL LC ;ALLOW LOWER CASE TEXT
9
10 ; INVOKE SYSTEM MACROS FOR PARAMETER DEFINITIONS
11
12 .MCALL ATARI
13 .MCALL M6502
14 0000 ATARI
15 0000 M6502
16
17 ;***** THINGS TO DO ******
18 ;
19 ; 1) Re-write parser for DDT syntax and better defaults
20 ; Make better use of ATARI keyboard!
21 ;
22 ;*************************
23
24 ;LBUG STORAGE ASSIGNMENTS (PAGE 0)
25
26 00E0 INBUF =$E0 ;INPUT BUFFER (2 BYTES)
27 00E2 POINT =$E2 ;OPEN CELL ADDRS (2 BYTES)
28 00E4 AC =$E4 ;ACCUMULATOR
29 00E5 XREG =$E5 ;X INDEX
30 00E6 YREG =$E6 ;Y INDEX
31 00E7 PS =$E7 ;PROCESSOR STATUS REG
32 00E8 SP =$E8 ;STACK POINTER
33
34 ;RANDOM CONSTANTS AND PARAMETERS
35
36 0031 DSKCOD =$31 ;DISK DEVICE CODE
37 0052 DSKR ='R ;DISK READ COMMAND
38 0057 DSKW ='W ;DISK WRITE COMMAND
39 0008 MAXBP =8 ;EIGHT IS TRADITIONAL (BREAK POINTS)
40 0018 LNSCR =24 ;# OF LINES ON SCREEN
41 0037 LPP =55 ;LINES/PAGE ON PRINTER
42
43 .IIF NDF,LORG, LORG= $8000 ;DEFAULT PROG ORIGIN
44
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 2
ALBUG.M65
46 ;MAIN ENTRY POINT - NORMAL START (LORG)
47 ;RESET ENTRY - REMOVE BREAKPOINTS (LORG+3)
48
49 0000 SETPC PPC,LORG
50
51 ;NORMAL START ENTRY
52
53 8000 4C 73 80 START: JMP STRT1
54 8003 4C 70 80 JMP RST
55
56 8006 7D 4C 61 VERS: .ASCII <.ATCLR>"Lady Bug - V4.0, (C) Ted Hess 1981"<.ATEOL>
8009 64 79 20
800C 42 75 67
800F 20 2D 20
8012 56 34 2E
8015 30 2C 20
8018 28 43 29
801B 20 54 65
801E 64 20 48
8021 65 73 73
8024 20 31 39
8027 38 31 9B
57 802A 0001 ROF: .BLKB 1 ; REGISTER OPENED FLAG
58 ; 0 = CLOSED
59 ; $1 = HEX/OCTAL
60 ; $FF = SYMBOLIC
61 802B 0001 CF: .BLKB 1 ;ADDRESS FLAG
62 ; $FF = NO ADDRESSES TYPED
63 ; $00 = ONE ADDRESS TYPED
64 ; $01 = COMMA TYPED
65 802C 0002 PRPC: .BLKB 2 ;PROGRAM COUNTER (AT BREAK)
66 802E 0001 LENGTH: .BLKB 1 ; LENGTH OF INSTR (0 := 1-BYTE)
67 802F 0001 PFRMT: .BLKB 1 ; PRINT FORMAT INDEX
68 8030 0002 VEB: .BLKB 2 ;4 BYTE PROGRAM BLOCK
69 8032 0001 LMNEM: .BLKB 1 ;(VEB+2) TEMP FOR MNEMONIC PRINT
70 8033 0001 RMNEM: .BLKB 1 ;(VEB+3) ...
71 8034 0002 STARTA: .BLKB 2 ;STARTING ADDRESS
72 8036 0002 ENDAD: .BLKB 2 ;ENDING ADDRESS
73 8038 0001 TEMPX: .BLKB 1 ;NEED TO SAVE X AROUND OS
74 8039 0001 TEMPY: .BLKB 1 ;TEMP SAVE Y
75 803A 0001 SNGLF: .BLKB 1 ;SINGLE STEP FLAG
76 803B 0001 BPN: .BLKB 1 ;BREAKPOINT NUMBER OR 0
77 803C 0001 DRVNO: .BLKB 1 ;DISK UNIT #
78 803D 0001 PIOCB: .BLKB 1 ;IOCB INDEX FOR PRINTER/EDITOR
79 803E 0001 PNTF: .BLKB 1 ; PRINTER FLAG
80
81 803F 0001 TABPT: .BLKB 1 ;INDEX INTO TAB RING
82 8040 0008 TABRNG: .BLKW 8 ;RING BUFFER FOR TAB/UNTAB
83
84 ;BREAKPOINT TABLES
85
86 8050 0008 BPINS: .BLKB MAXBP ;SAVE INSTR
87 8058 0008 BPCNT: .BLKB MAXBP ;PROCEED COUNT
88 8060 0008 BPLOCL: .BLKB MAXBP ;LOCATION LOW
89 8068 0008 BPLOCH: .BLKB MAXBP ;LOCATION HIGH
90
91 ;RESET ENTRY
92
93 8070 20 3F 88 RST: CALL REMB ;REMOVE BREAK POINTS
94
95 ; NORMAL STARTUP JOINS HERE
96
97 8073 20 A8 87 STRT1: CALL INITS ;INITIALIZE THINGS
98 8076 TYPE VERS ;OUTPUT HERALD
(1) 8076 A2 06
(1) 8078 A0 80
(1) 807A 20 85 F3
99 807D CLR <SNGLF,BPN,DRVNO,PS> ;CLEAR SS FLAG, ETC.
(1) 807D A9 00
(2) 807F 8D 3A 80
(2) 8082 8D 3B 80
(2) 8085 8D 3C 80
(2) 8088 85 E7
100 808A SET2 BREAK,VBREAK ;BREAK POINT ENTRY
(1) 808A A9 73
(1) 808C 8D 06 02
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 2-1
ALBUG.M65
(1) 808F A9 88
(1) 8091 8D 07 02
101 8094 BA TSX ;SAVE CURRENT STACK POINTER
102 8095 86 E8 STX SP
103 8097 4C BC 82 JMP RALL ;CLEAR ALL BREAK POINTS
104
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 3
ALBUG.M65
106 ;MAIN DECODER
107
108 809A 20 DF 80 ERR: CALL ERRFST ;PRINT <BELL>?
109
110 809D 20 2E 88 DCD: CALL CLOSEP ;CLOSE PRINTER IF OPEN
111 80A0 20 85 87 CALL CRLFS ;PRINT CRLF
112 80A3 DCD4: CLR ROF ;CLOSE OPEN REG
(1) 80A3 A9 00
(2) 80A5 8D 2A 80
113 80A8 A6 E8 LDX SP ;RESTORE STACK POINTER
114 80AA 9A TXS
115
116 80AB A9 FF SCAN: LDA #$FF ;SET UP ADDRESS FLAG
117 80AD 8D 2B 80 STA CF
118 80B0 20 7C 86 CALL GETNUM ;INPUT SOMETHING
119 80B3 AE 2B 80 LDX CF ;GET QUANITY TYPED FLAG
120 80B6 30 0A BMI CLGL ;DO NOT DESTROY OLD VALUE FOR ' AND =
121
122 80B8 SCAN1: MOV2X INBUF,STARTA ;SET UP STARTING ADDRESS
(1) 80B8 A6 E0
(1) 80BA 8E 34 80
(1) 80BD A6 E1
(1) 80BF 8E 35 80
123 ;FALL INTO SPECAIL CHARACTER DECODER
124
125
126 ;HERE TO CHECK LEGAL CHARACTER
127
128 80C2 A2 0C CLGL: LDX #MAXL ;INIT INDEX
129 80C4 DD EE 8A LGL1: CMP LGCH,X ;MATCH?
130 80C7 F0 05 BEQ LGL2 ;YES - PROCEED
131 80C9 CA DEX ;NO - STEP TO NEXT
132 80CA 10 F8 BPL LGL1 ;BRANCH IF MORE TO GO
133 80CC 30 CC BMI ERR ;ERROR IF NONE
134
135 ;FOUND MATCH - DISPATCH
136
137 80CE 8A LGL2: TXA ;GET INDEX
138 80CF 0A LGL3: ASL A ; TIMES 2
139 80D0 AA TAX ; BACK TO X
140 80D1 BD 06 8B LDA LDISP+1,X ;GET HIGH BYTE OF XFER
141 80D4 48 PHA ;PUT ON STACK
142 80D5 BD 05 8B LDA LDISP,X ;GET XFER LOW
143 80D8 48 PHA ;STACK NOW HAS XFER ADDRS
144 80D9 AD 2B 80 LDA CF ;GET ARGUMENT FLAG IN AC
145 80DC C9 01 CMP #1 ;SET FLAGS BASED ON ONE
146 80DE 60 RET ;DISPATCH
147
148 80DF A9 FD ERRFST: LDA #.ATBEL ;RING BELL
149 80E1 20 6D 87 CALL OUTSCH
150 80E4 A9 3F LDA #'? ;THEN PRINT ?
151 80E6 4C 6D 87 JMP OUTSCH
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 4
ALBUG.M65
153 ;COMMA - SAVE INPUT AS STARTING ADDRESS
154
155 80E9 AD 2B 80 COMMA: LDA CF ;GET ARGUMENT FLAG IN AC
156 80EC D0 AC BNE ERR ;MUST BE ONE AND ONLY ONE ARGUMENT TYPED SO FAR
157 80EE 20 7C 86 CALL GETNUM ;GET ANOTHER ARGUMENT
158 80F1 COMMA1: MOV2X INBUF,ENDAD ;SET UP ENDING ADDRESS
(1) 80F1 A6 E0
(1) 80F3 8E 36 80
(1) 80F6 A6 E1
(1) 80F8 8E 37 80
159 80FB AE 2B 80 LDX CF ;GET ARGUMENT FLAG
160 80FE E0 02 CPX #2 ;CHECK TO SEE IF IT IS OPEN
161 8100 10 98 BPL ERR ;NO THEN IT IS AN ERROR
162 8102 30 BE BMI CLGL ;GO DISPATCH ON BREAK CHARACTER
163
164
165 ;ESC SEEN (ECHO $)
166
167 8104 A9 24 ESC: LDA #'$
168 8106 20 6D 87 CALL OUTSCH
169 8109 20 F0 86 CALL GETSCH ;GET NEXT CHARACTER
170 810C 38 SEC ;CLEAR BORROW
171 810D E9 31 SBC #'1 ;CHECK FOR NUMBER
172 810F 30 89 BMI ERR ;IF LESS THAN THEN IT IS AN ERROR
173 8111 C9 08 CMP #MAXBP ;IS IT LESS THAN MAXIMUM ALLOWABLE BREAKPOINT
174 8113 30 24 BMI ESCB ;YES GO GET BREAKPOINT B
175 8115 E9 10 SBC #@20 ;CHECK FOR A
176 8117 30 81 BMI ERR ;IF LESS THAN A IT IS AN ERROR
177 8119 29 DF AND #@337 ;GET RID OF LOWERCASE BIT
178 811B C9 1A CMP #'Z-@100 ;IS IT GREATER THAN Z
179 811D 10 49 BPL ERR1 ;YES. REPORT ERROR
180 811F AA TAX ;PUT IT IN THE X REGISTER
181 8120 BD 53 8B LDA ARGNUM,X ;GET NUMBER OF ARGUMENTS
182 8123 CD 2B 80 CMP CF ;IS IT CORRECT
183 8126 F0 0B BEQ 10$ ;YES. SKIP REST OF TEST
184 8128 C9 80 CMP #$80 ;IS IT ONE OR NONE FLAG
185 812A D0 3C BNE ERR1 ;NO GIVE ERROR
186 812C AD 2B 80 LDA CF ;GET FLAG
187 812F C9 01 CMP #1 ;LESS THAN ONE
188 8131 10 35 BPL ERR1 ;NO. GO GIVE ERROR
189 8133 8A 10$: TXA ;GET INDEX BACK TO A
190 8134 18 CLC
191 8135 69 0D ADC #<DISP-LDISP>/2 ;CALC TABLE OFFSET
192 8137 D0 96 BNE LGL3 ;DISPATCH
193
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 5
ALBUG.M65
195 8139 AA ESCB: TAX ;SAVE BP NUMBER IN X
196 813A 20 F0 86 CALL GETSCH ;GET THE CHARACTER
197 813D 29 DF AND #@337 ;GET RID OF CASE BIT
198 813F C9 42 CMP #'B ;IS IT A B
199 8141 D0 25 BNE ERR1 ;NO. THEN IT IS AN ERROR
200 8143 4C 6D 82 JMP BKPT1 ;YES. GO DO BREAKPOINT
201
202
203 ;DOT (.) SEEN - SUBSTITUE CURRENT LOC
204
205 8146 DOT: MOV2 POINT,INBUF ;PUT LOC INTO BUFFER
(1) 8146 A5 E2
(1) 8148 85 E0
(1) 814A A5 E3
(1) 814C 85 E1
206 814E 20 F0 86 DOT1: CALL GETSCH ;GET ANOTHER CHARACTER
207 8151 EE 2B 80 INC CF ;SAY QUANT TYPED
208 8154 D0 9B BNE COMMA1 ;GO SET UP ENDING ADDRESS
209 8156 4C B8 80 JMP SCAN1 ;BACK TO SCAN LOOP
210
211
212 ;PERCENT SEEN - SPECIAL REGISTER
213
214 8159 20 F0 86 PERC: CALL GETSCH ;LOOK AT NEXT CHAR
215 815C 29 DF AND #@337 ;GET RID OF CASE BIT
216 815E A2 04 LDX #MAXS ; AND CHECK FOR SPECIAL
217 8160 DD FB 8A PERC1: CMP LGPC,X ;MATCH?
218 8163 F0 06 BEQ PERC2 ;???
219 8165 CA DEX ;NO - STEP TO NEXT
220 8166 10 F8 BPL PERC1
221 8168 4C 9A 80 ERR1: JMP ERR ;ERROR IF NO MORE
222
223
224 ;SETUP DESIRED REGISTER ADDRS AS INPUT TYPED
225
226 816B BD 00 8B PERC2: LDA PERAD,X ;GET ADDRS OF BYTE
227 816E 85 E0 STA INBUF ;STORE AS INPUT
228 8170 CLR INBUF+1
(1) 8170 A9 00
(2) 8172 85 E1
229 8174 F0 D8 BEQ DOT1 ;BACK TO INPUT LOOP
230
231
232 ;CARRIAGE RETURN TYPED
233
234 8176 20 27 86 CRET: CALL CLSE ;CLOSE OPEN REG IF ANY
235 8179 4C 9D 80 JMP DCD ;RE-INIT THINGS
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 6
ALBUG.M65
237 ;SLASH TYPED - OPEN A REG IN SYMBOLIC
238
239 817C 10 EA SLSH: BPL ERR1 ;IF MORE THAN ONE ARGUMENT IT IS AN ERROR
240 817E A9 FF LDA #$FF ;SET ROF FLAG
241 8180 D0 04 BNE SLSH1 ;JOIN COMMON CODE
242
243 ;SLASH TYPED - OPEN A REG (HEX)
244
245 8182 10 E4 BRAKET: BPL ERR1 ;IF MORE THAN ONE ARGUMENT IT IS AN ERROR
246 8184 A9 01 LDA #1 ;SET REG OPEN
247 8186 8D 2A 80 SLSH1: STA ROF
248 8189 20 6B 87 CALL OUTSSP ;TYPE A SPACE
249 818C AD 2B 80 LDA CF ;ANYTHING TYPED
250 818F D0 03 BNE 10$ ; ??
251 8191 20 41 86 CALL INTPT ;YES - OPEN IT
252 8194 20 2F 87 10$: CALL PRTSCN ;GO DO OUTPUT
253 8197 4C AB 80 JMP SCAN
254
255
256 ;LINE FEED - OPEN NEXT REG
257
258 819A 10 CC LFD: BPL ERR1 ;IF MORE THAN ONE ARGUMENT IT IS AN ERROR
259 819C 20 85 87 CALL CRLFS ;OUTPUT <EOL>
260 819F AD 2A 80 LFD0: LDA ROF ;CHECK TYPE
261 81A2 30 11 BMI LFDS ;DO SYMBOLIC NEXT INSTR
262 81A4 20 27 86 CALL CLSE ;CLOSE OPEN REG IF ANY
263 81A7 20 D0 87 CALL INCPT ;STEP TO NEXT LOC
264 81AA EE 2A 80 LFDC: INC ROF ;MARK OPEN HEX
265 81AD A2 5B LDX #'[ ;SLASH
266 81AF 20 25 87 CALL PRTSLC ;GO PRINT THE CONTENTS
267 81B2 4C AB 80 JMP SCAN
268
269 81B5 20 00 8A LFDS: CALL PCADJ ;STEP OVER INSTR
270 81B8 85 E2 STA POINT ;SAVE NEW PC
271 81BA 84 E3 STY POINT+1
272 81BC 20 1E 87 LFDS1: CALL PRTSLS ;GO PRINT LOCATION IN SYMBOLIC
273 81BF 4C AB 80 JMP SCAN ;BACK TO MAIN COMMAND DECODER
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 7
ALBUG.M65
275 ;^ OR <BS> TYPED - OPEN PREVIOUS
276
277 81C2 10 A4 BACK: BPL ERR1 ;IF MORE THAN ONE ARGUMENT IT IS AN ERROR
278 81C4 20 27 86 CALL CLSE ;CLOSE OPEN REG
279 81C7 20 4C 86 CALL DECPT ;DECREMENT THE POINTER
280 81CA 20 85 87 CALL CRLFS ;PUT OUT A CARRIAGE RETURN LINE FEED
281 81CD 4C AA 81 JMP LFDC ;COMMON CODE
282
283 ;TAB GO TO ADDRESS IF IN SYMBOLIC MODE
284
285 81D0 10 96 TAB: BPL ERR1 ;ERROR IF MORE THAN 1 ARG
286 81D2 AD 2A 80 LDA ROF ;GET OUTPUT MODE FLAG
287 81D5 10 91 BPL ERR1 ;ONLY GET EFFECTIVE ADDRESS IF SYMBOLIC
288 81D7 AE 3F 80 LDX TABPT ;SAVE POINT
289 81DA A5 E2 LDA POINT
290 81DC 9D 40 80 STA TABRNG,X ;IN RING BUFFER
291 81DF A5 E3 LDA POINT+1
292 81E1 9D 48 80 STA TABRNG+8,X
293 81E4 E8 INX ;STEP INDEX
294 81E5 8A TXA
295 81E6 29 07 AND #$07 ;MASK TO MOD 8 CNTR
296 81E8 8D 3F 80 STA TABPT ;STORE IT BACK
297 81EB 20 7E 89 CALL CALCAD ;CALCULATE EFFECTIVE ADDRESS
298 81EE MOV2 INBUF,POINT ;GET JMP ADDRESS
(1) 81EE A5 E0
(1) 81F0 85 E2
(1) 81F2 A5 E1
(1) 81F4 85 E3
299 81F6 20 85 87 TAB1: CALL CRLFS ;PUT OUT CARRIAGE RETURN LINE FEED
300 81F9 4C BC 81 JMP LFDS1 ;GO TYPE OUT NEW ADDRESS
301
302 ; UNTABIFY - POP RING THEN TAB
303
304 81FC 10 03 UNTAB: BPL 5$ ;ERROR IF ANYTHING TYPED
305 81FE AD 2A 80 LDA ROF ;REGISTER OPEN FLAG
306 8201 10 7D 5$: BPL ERR2 ;ERROR IF NOT SYMBOLIC MODE
307 8203 A9 07 LDA #$7 ;MASK FOR MOD 8 SUBTRACT
308 8205 CE 3F 80 DEC TABPT ;DECREMENT INDEX
309 8208 2D 3F 80 AND TABPT ;MASK IT
310 820B 8D 3F 80 STA TABPT ;STORE RESULT
311 820E AA TAX ;XFER TO INDEX
312 820F BD 40 80 LDA TABRNG,X ;FETCH SAVED VALUE
313 8212 85 E2 STA POINT ;RESTORE TO POINT
314 8214 BD 48 80 LDA TABRNG+8,X
315 8217 85 E3 STA POINT+1
316 8219 4C F6 81 JMP TAB1 ;FINISH THRU COMMON CODE
317
318 ;EQUAL SIGN - TYPE IN OCTAL
319
320 821C 10 62 TOC: BPL ERR2 ;IF MORE THAN ONE ARGUMENT IT IS AN ERROR
321 821E AD 34 80 LDA STARTA ;GET CHARACTER IN A
322 8221 8D 2F 80 STA PFRMT ;SAVE BYTE
323 8224 A2 03 LDX #3 ;TYPE 3 DIGITS
324 8226 A0 03 LDY #3 ; OF 3 BITS EACH
325 8228 18 CLC ;INIT CARRY BIT
326 8229 90 03 BCC 15$ ;SKIP FIRST SHIFT
327 822B 0E 2F 80 10$: ASL PFRMT ;SHIFT LEFT
328 822E 2A 15$: ROL A ;GET BIT INTO AC
329 822F 88 DEY ;COUNT BITS
330 8230 D0 F9 BNE 10$ ;CONTINUE FOR 3 BITS
331 8232 29 07 AND #@7 ;GRNTEE OIT
332 8234 20 A3 87 CALL HEXST1 ;TYPE OUT
333 8237 A0 03 LDY #3 ;RELOAD BIT COUNTER
334 8239 CA DEX ;DECREMENT DIGIT COUNTER
335 823A D0 EF BNE 10$ ;LOOP TILL DONE
336 823C 20 6B 87 TOCRET: CALL OUTSSP ;PRINT SPACE
337 823F 4C AB 80 JMP SCAN ;BACK TO MAIN LOOP
338
339
340 ;QUOTE - TYPE OUT ASCII
341
342 8242 10 3C QUOTE: BPL ERR2 ;IF MORE THAN ONE ARGUMENT IT IS AN ERROR
343 8244 AD 34 80 LDA STARTA ;GET CHARACTER IN A
344 8247 20 6D 87 CALL OUTSCH ;PRINT THE CHARACTER IN ASCII
345 824A 4C 3C 82 JMP TOCRET ;GO PRINT A SPACE AND RETURN
346
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 8
ALBUG.M65
348 ;$A - TYPE MEMORY OUT IN ASCII
349
350 824D 20 41 86 ASCII: CALL INTPT ;SET UP POINT FROM ADDRESS TYPED
351 8250 20 F0 86 CALL GETSCH ;GET QUOTE CHARACTER
352 8253 8D 2B 80 STA CF ;SAVE IT FOR COMPARE
353 8256 20 F0 86 10$: CALL GETSCH ;GET ANOTHER CHARACTER
354 8259 CD 2B 80 CMP CF
355 825C F0 0A BEQ 20$ ;IF QUOTE RETURN
356 825E A0 00 LDY #0 ;SET UP FOR INDEXING
357 8260 91 E2 STA (POINT),Y ;PUT THE CHARACTER IN MEMORY
358 8262 20 D0 87 CALL INCPT ;INCREMENT THE POINTER
359 8265 4C 56 82 JMP 10$ ;GO DO ANOTHER CHARACTER
360
361 8268 4C 9D 80 20$: JMP DCD ;GO BACK TO MAIN SCANING LOOP
362
363
364 ;$B - BREAKPOINT COMMAND
365
366 826B A2 FF BKPT: LDX #$FF ;SAY NO BREAKPOINT NUMBER GIVEN
367 826D AD 2B 80 BKPT1: LDA CF ;GET ARGUMENT FLAG
368 8270 30 46 BMI CLRALL ;POSSIBLE CLEAR ALL $B OR $NB/
369 8272 E0 00 CPX #0 ;SPECIFIC BREAK POINT
370 8274 10 0D BPL BKPT2 ; IF QUANT AFTER $
371 8276 A2 07 LDX #MAXBP-1 ;LOOK FOR A FREE ONE
372 8278 BD 50 80 5$: LDA BPINS,X
373 827B F0 06 BEQ BKPT2 ;FOUND IF ZERO
374 827D CA DEX ;STEP TO NEXT
375 827E 10 F8 BPL 5$ ; AND TRY AGAIN
376 8280 4C 9A 80 ERR2: JMP ERR ;BRANCH TO HERE FOR ERROR
377
378 ;X NOW CONTAINS AN INDEX INTO THE BP TABLES
379
380 8283 AD 34 80 BKPT2: LDA STARTA ;CHECK FOR 0$NB
381 8286 D0 05 BNE SETBP ;IF NOT ZERO CONTINUE
382 8288 AD 35 80 LDA STARTA+1 ;GET HIGH BYTE
383 828B F0 23 BEQ CLRONE ;CLEAR JUST ONE
384
385 ;NOW SET A BREAK POINT - ADDRS IN INTMP
386
387 828D SETBP: MOV2 STARTA,INBUF ;NEED IN PAGE 0 LOC
(1) 828D AD 34 80
(1) 8290 85 E0
(1) 8292 AD 35 80
(1) 8295 85 E1
388 8297 A0 00 LDY #0 ;SET FOR INDIRECT
389 8299 B1 E0 LDA (INBUF),Y ;FETCH INSTR
390 829B F0 E3 BEQ ERR2 ;ERROR IF 00
391 829D 9D 50 80 STA BPINS,X ;SAVE IN TABLE
392 82A0 A5 E0 LDA INBUF ;SAVE ADDRS
393 82A2 9D 60 80 STA BPLOCL,X ; LOW
394 82A5 A5 E1 LDA INBUF+1 ; AND HIGH
395 82A7 9D 68 80 STA BPLOCH,X ;...
396 ; ...
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 9
ALBUG.M65
398 ; ...
399 82AA 20 62 87 BPXIT: CALL PRBLNK ;PRINT SOME SPACES
400 82AD 4C AB 80 JMP SCAN ;BACK TO DECODER
401
402
403 ;ROUTINE TO CLEAR ONE BREAKPOINT
404 ;C(X) - INDEX INTO BP TABLES, C(AC) := 0
405
406 82B0 9D 50 80 CLRONE: STA BPINS,X ;CLEAR BP
407 82B3 9D 58 80 STA BPCNT,X ; AND PROCEED COUNT
408 82B6 F0 F2 BEQ BPXIT ;RETURN
409
410 ;ROUTINE TO CLEAR ALL BREAK POINTS
411
412 82B8 E0 00 CLRALL: CPX #0 ;SPECIFIC BREAK POINT
413 82BA 10 10 BPL SHONE ;SHOW ONE BP
414 82BC A2 07 RALL: LDX #MAXBP-1 ;INIT COUNT
415 82BE A9 00 LDA #0 ;GET A ZERO
416 82C0 9D 50 80 5$: STA BPINS,X ;CLEAR BP
417 82C3 9D 58 80 STA BPCNT,X ;...
418 82C6 CA DEX
419 82C7 10 F7 BPL 5$ ;LOOP TILL DONE
420 82C9 4C 9D 80 JMP DCD ;RE-INIT THINGS
421
422
423 ;ROUTINE TO SHOW LOC OF BP
424
425 82CC 20 F0 86 SHONE: CALL GETSCH ;LOOK AHEAD CHAR
426 82CF C9 2F CMP #'/ ;GAURNTEE SLASH
427 82D1 D0 AD BNE ERR2
428 82D3 20 6B 87 CALL OUTSSP ;SPACE OVER
429 82D6 BD 50 80 LDA BPINS,X ;SEE IF ACTIVE
430 82D9 F0 A5 BEQ ERR2 ;NO - SORRY
431 82DB BD 68 80 LDA BPLOCH,X ;GET LOC HIGH
432 82DE 20 91 87 CALL PRTSBY ;PRINT IT
433 82E1 BD 60 80 LDA BPLOCL,X ;GET LOC LOW
434 82E4 20 91 87 CALL PRTSBY ;PRINT IT
435 82E7 4C 9D 80 JMP DCD ;CLOSE REG, ETC.
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 10
ALBUG.M65
437 ;$D - JUMP TO DOS
438
439 82EA 6C 0A 00 TODOS: JMP (DOSVEC)
440
441 ;$U - SELECT DISK UNIT
442
443 82ED AD 34 80 SETU: LDA STARTA ;GET UNIT #
444 82F0 F0 8E BEQ ERR2 ;MUST BE 1-4
445 82F2 C9 05 CMP #5 ;VALID?
446 82F4 90 8A BCC ERR2 ;TOO LARGE
447 82F6 8D 3C 80 STA DRVNO ;STORE UNIT #
448 82F9 4C AA 82 JMP BPXIT ;RETURN
449
450 ;$W - WRITE DISK SECTORS FROM MEMORY
451
452 82FC 20 6A 86 WRSECT: CALL GETVAL ;BUFFER
453 82FF A9 57 LDA #DSKW ;WRITE COMMAND
454 8301 D0 05 BNE INIDSK ;DO IT
455
456 ;$R - READ DISK SECTORS INTO MEMORY
457
458 8303 20 6A 86 RDSECT: CALL GETVAL ;GET BUFFER ADDRS
459 8306 A9 52 LDA #DSKR ;READ COMMAND
460 8308 8D 02 03 INIDSK: STA DCOMND ;STORE
461 830B MOV2 INBUF,DBUFLO ;SETUP BUFFER
(1) 830B A5 E0
(1) 830D 8D 04 03
(1) 8310 A5 E1
(1) 8312 8D 05 03
462 8315 20 3E 86 CALL INTPTC ;SET POINT := START SECTOR
463 8318 A9 31 LDA #DSKCOD ;BUS I.D. FOR DISK
464 831A 8D 00 03 STA DDEVIC
465 831D AD 3C 80 LDA DRVNO ;SETUP DRIVE #
466 8320 8D 01 03 STA DUNIT
467 8323 A9 80 LDA #128 ;BYTE COUNT
468 8325 8D 08 03 STA DBYTLO
469 8328 CLR DBYTHI
(1) 8328 A9 00
(2) 832A 8D 09 03
470 832D DSKLUP: MOV2 POINT,DAUX1 ;SETUP SECTOR ADDRS
(1) 832D A5 E2
(1) 832F 8D 0A 03
(1) 8332 A5 E3
(1) 8334 8D 0B 03
471 8337 20 53 E4 CALL DSKINV ;INVOKE DISK HANDLER
472 833A 30 16 BMI IOCERR ;ERROR CODE IS .GE. $80
473 833C 20 58 86 CALL ENDCHK ;CHECK END, INCR POINT
474 833F 18 CLC ;NOT END - STEP TO NEXT BUFFER
475 8340 A9 80 LDA #128 ;128 BYTE/BUFFER
476 8342 6D 04 03 ADC DBUFLO
477 8345 8D 04 03 STA DBUFLO
478 8348 A9 00 LDA #0 ;PROPAGATE CARRY
479 834A 6D 05 03 ADC DBUFHI
480 834D 8D 05 03 STA DBUFHI
481 8350 D0 DB BNE DSKLUP ;LOOP TILL DONE
482
483 8352 20 DF 80 IOCERR: CALL ERRFST ;OUT <BELL>?
484 8355 20 6B 87 CALL OUTSSP
485 8358 AD 03 03 LDA DSTATS ;GET STATUS
486 835B 20 91 87 CALL PRTSBY ;PRINT ERROR CODE
487 835E 20 62 87 CALL PRBLNK ;SOME BLANKS
488 8361 20 8A 87 CALL PRTSPT ; THEN DISK ADDRS
489 8364 4C 9D 80 JMP DCD ;RETURN
490
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 11
ALBUG.M65
492 ;$F - FIND A BYTE IN MEMORY
493
494 8367 20 6A 86 FIND: CALL GETVAL ;GET THE BYTE
495 836A 20 3E 86 CALL INTPTC ;SET UP INDIRECT POINTER FROM START
496 836D A9 01 LDA #1
497 836F 8D 2A 80 STA ROF ;SET THE MODE FLAG
498 8372 A0 00 10$: LDY #0 ;SET UP INDEX
499 8374 B1 E2 LDA (POINT),Y ;GET BYTE FROM MEMORY
500 8376 C5 E0 CMP INBUF ;DOES IT MATCH
501 8378 D0 08 BNE 20$ ;NO
502 837A A2 5B LDX #'[ ;SLASH
503 837C 20 25 87 CALL PRTSLC ;GO PRINT THE CONTENTS
504 837F 20 85 87 CALL CRLFS ;PUT OUT CARRIAGE RETURN LINE FEED
505 8382 20 58 86 20$: CALL ENDCHK ;ARE WE FINISHED
506 8385 4C 72 83 JMP 10$ ;NO
507
508
509 ;$G - START SOMEWHERE
510
511 8388 20 3E 86 GO: CALL INTPTC ;GO SETUP ADDRESS
512 838B CLR <BPN,SNGLF> ;CLEAR CURRENT BP
(1) 838B A9 00
(2) 838D 8D 3B 80
(2) 8390 8D 3A 80
513 8393 20 5C 88 GO2: CALL INSB ;INSERT BP'S
514 8396 A6 E8 GO3: LDX SP ;RESTORE STACK
515 8398 9A TXS
516 8399 A5 E3 LDA POINT+1 ;SETUP RETURN ADDRS
517 839B 48 PHA ; ON STACK FOR RTI
518 839C A5 E2 LDA POINT
519 839E 48 PHA ;...
520 839F A5 E7 LDA PS ;PROCESSOR STATUS
521 83A1 48 PHA
522 83A2 A6 E5 LDX XREG ;RESTORE REGS
523 83A4 A4 E6 LDY YREG
524 83A6 A5 E4 LDA AC ;...
525 83A8 40 RTI ;GO BACK
526
527 ;HERE IF SINGLE STEP - SETUP FOR RE-ENTER AFTER XCT
528
529 83A9 AC 4F 85 GO1: LDY IOPC ;CHECK FOR JUMPS
530 83AC C0 4C CPY #$4C
531 83AE F0 0E BEQ GOJMP ;VANILLA JUMP
532 83B0 C0 6C CPY #$6C ;MAYBE JUMP, INDIRECT
533 83B2 F0 14 BEQ GOJMPI ; A LITTLE MORE HAIRY
534 83B4 C0 60 CPY #$60 ;"RTS"?
535 83B6 F0 2A BEQ IRTS ; INTERPRET SUBROUTINE RETURN
536 83B8 C0 40 CPY #$40 ;"RTI"
537 83BA F0 43 BEQ IRTI ; INTERPRET INTERRUPT RETURN
538 83BC D0 D8 BNE GO3 ; AND GO EXECUTE
539
540 83BE GOJMP: SET2 XCTBR,POINT ;EXECUTE HERE
(1) 83BE A9 6C
(1) 83C0 85 E2
(1) 83C2 A9 85
(1) 83C4 85 E3
541 83C6 D0 CE BNE GO3
542
543 83C8 GOJMPI: MOV2 XBTARG,POINT ;NEED TO PICK UP ACTUAL TARGET
(1) 83C8 AD 7B 85
(1) 83CB 85 E2
(1) 83CD AD 7C 85
(1) 83D0 85 E3
544 83D2 A0 00 LDY #0
545 83D4 B1 E2 LDA (POINT),Y
546 83D6 8D 7B 85 STA XBTARG ;AND SET UP FOR "BRANCH" SIMULATION
547 83D9 C8 INY ;SET TO NEXT LOC
548 83DA B1 E2 LDA (POINT),Y
549 83DC 8D 7C 85 STA XBTARG+1
550 83DF 4C BE 83 JMP GOJMP ;NO GO SIMULATE JMP (I)
551
552 83E2 A6 E8 IRTS: LDX SP ;GET STACK POINTER
553 83E4 9A TXS ;SETUP FOR "RTS" SIMULATION
554 83E5 68 IRTS1: PLA ;PCL
555 83E6 8D 7B 85 STA XBTARG
556 83E9 68 PLA ;PCH
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 11-1
ALBUG.M65
557 83EA 8D 7C 85 STA XBTARG+1
558 83ED C0 40 CPY #$40 ;IS THIS SUBR OR INTERRUPT
559 83EF F0 08 BEQ 10$ ;DON'T INCREMENT PC IF "RTI"
560 83F1 EE 7B 85 INC XBTARG ;"RTS" NEED PC + 1
561 83F4 D0 03 BNE 10$
562 83F6 EE 7C 85 INC XBTARG+1
563 83F9 BA 10$: TSX ;SAVE MODIFIED STACK PNTR
564 83FA 86 E8 STX SP
565 83FC 4C BE 83 JMP GOJMP
566
567 83FF A6 E8 IRTI: LDX SP ;SETUP STACK POINTER
568 8401 9A TXS
569 8402 68 PLA ;GET PROCESSOR STATUS
570 8403 85 E7 STA PS
571 8405 4C E5 83 JMP IRTS1 ;GOIN COMMON CODE
572
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 12
ALBUG.M65
574 ;$H - HEX DUMP TO TTY
575
576 8408 20 41 86 HDUMP: CALL INTPT ;SET UP START AND END ADDRESS
577 840B A5 E2 LDA POINT ;GET LOW PART OF ADDRESS
578 840D 29 F0 AND #$F0 ;MAKE IT START ON A NICE BOUNDRY
579 840F 85 E2 STA POINT
580 8411 20 A4 85 10$: CALL SETOUT ;SETUP OUTPUT DEVICE / GET LPP
581 8414 8D 2E 80 STA LENGTH ; SAVE IT AWAY
582 8417 20 85 87 20$: CALL CRLFS ;PRINT OUT CARRAGE RETURN LINEFEED
583 841A 20 8A 87 CALL PRTSPT ;PRINT OUT THE LOCATION
584 841D A9 10 LDA #$10 ;NUMBER OF BYTES PER LINE
585 841F 20 47 87 CALL DMPLIN ;PRINT A LINE OF DUMP
586 8422 20 58 86 CALL ENDCHK ;CHECK TO SEE IF WE ARE FINISHED
587 8425 CE 2E 80 DEC LENGTH ;COUNT LINE
588 8428 D0 ED BNE 20$ ;GO DO ANOTHER LINE
589 842A 20 DB 86 CALL PAGEWT ;GO WAIT FOR CONTINUE
590 842D 4C 11 84 JMP 10$ ;GO DO ANOTHER PAGE
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 13
ALBUG.M65
592 ;$I - INITIALIZE MEMORY
593
594 8430 20 6A 86 INIT: CALL GETVAL ;GET VALUE
595 8433 A6 E0 LDX INBUF ;GET BYTE INTO X
596 8435 20 3E 86 INITM1: CALL INTPTC ;SET UP ADDRESSES
597 8438 8A 10$: TXA ;GET CHARACTER BACK
598 8439 A0 00 LDY #0 ;SET UP FOR INDEXING
599 843B 91 E2 STA (POINT),Y ;SET MEMORY TO SPECIFIED VALUE
600 843D 20 58 86 CALL ENDCHK ;CHECK TO SEE IF FINISHED
601 8440 4C 38 84 JMP 10$ ;NO GO DO ANOTHER VALUE
602
603
604 ;$Z - ZERO MEMORY
605
606 8443 A2 00 ZERO: LDX #0 ;GET A ZERO
607 8445 F0 EE BEQ INITM1 ;GO INITIALIZE MEMORY
608
609 ;$M - MOVE A BLOCK OF STORE
610
611 8447 A9 8D MOVE: LDA #$8D ;GET STORE OPCODE
612 8449 20 BB 87 CALL INTIVB ;SET UP STORE AND RETURN IN VEB
613 844C 20 6A 86 CALL GETVAL ;GET TO ADDRESS
614 844F 20 41 86 CALL INTPT ;SET UP POINT FROM START
615 8452 MOV2 INBUF,VEB+1 ;SET UP ADDRESS
(1) 8452 A5 E0
(1) 8454 8D 31 80
(1) 8457 A5 E1
(1) 8459 8D 32 80
616 845C A0 00 10$: LDY #0 ;SET UP FOR INDEXING
617 845E B1 E2 LDA (POINT),Y ;GET BYTE
618 8460 20 30 80 CALL VEB ;STORE IT AT NEW ADDRESS
619 8463 20 D7 87 CALL INCVEB ;BUMP THE VEB POINTER
620 8466 20 58 86 CALL ENDCHK ;FINISHED?
621 8469 4C 5C 84 JMP 10$ ;NO
622
623 ;$L - PRINTER SELECT TOGGLE
624
625 846C AD 34 80 PNTSEL: LDA STARTA ;COMPLIMENT PRINTER FLAG
626 846F 8D 3E 80 STA PNTF
627 8472 4C AA 82 JMP BPXIT ;RETURN TO MAIN LOOP
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 14
ALBUG.M65
629 ;$O - CALCULATE BRANCH OFFSET
630
631 8475 20 62 87 OFFSET: CALL PRBLNK ;PUT OUT SOME BLANKS
632 8478 18 CLC ;MAKE FROM BE ONE MORE
633 8479 AD 36 80 LDA ENDAD ;GET FIRST OF TO ADDRESS
634 847C ED 34 80 SBC STARTA ;SUBTRACT FROM ADDRESS
635 847F AA TAX ;SAVE LOW ORDER PART OF ADDRESS
636 8480 AD 37 80 LDA ENDAD+1 ;GET HIGH PART OF TO ADDRESS
637 8483 ED 35 80 SBC STARTA+1 ;SUBTRACT FROM ADDRESS
638 8486 A8 TAY ;SAVE HIGH ORDER BYTE
639 8487 D0 05 BNE 10$ ;IF IT IS ZERO MAY BE LEGAL ADDRESS
640 8489 8A TXA ;GET LOW PART BACK
641 848A 10 0D BPL 30$ ;VALID ADDRESS
642 848C 30 07 BMI 20$ ;ELSE ILLEGAL ADDRESS
643 848E C9 FF 10$: CMP #$FF ;OR $FF IS LEGAL
644 8490 D0 03 BNE 20$
645 8492 8A TXA ;GET LOW PART BACK
646 8493 30 04 BMI 30$ ;VALID ADDRESS
647 8495 98 20$: TYA ;GET HIGH ORDER BYTE
648 8496 20 91 87 CALL PRTSBY ;GO PRINT HIGH ORDER BYTE
649 8499 8A 30$: TXA ;GET LOW ORDER BYTE
650 849A 20 91 87 CALL PRTSBY ;PRINT LOW BYTE
651 849D 20 85 87 CALL CRLFS ;AND CARRIAGE RETURN LINE FEED
652 84A0 4C AB 80 JMP SCAN ;GO BACK TO MAIN LOOP
653
654 ;$P - PROCEED FROM BREAKPOINT
655
656 84A3 20 85 87 PROC: CALL CRLFS ;SIGNAL START
657 84A6 CLR SNGLF ;NOT SINGLE STEP
(1) 84A6 A9 00
(2) 84A8 8D 3A 80
658 84AB AD 2B 80 LDA CF ;QUANT TYPED
659 84AE 30 07 BMI PROC1 ;NO - PROCEED ONCE
660 84B0 AD 34 80 LDA STARTA ;GET LOW BYTE OF COUNT
661 84B3 F0 0E BEQ PERR ;DON'T ALLOW 0$P
662 84B5 D0 02 BNE PROC2 ;PROCEED COUNT IN AC
663
664 84B7 A9 01 PROC1: LDA #1 ;PRELOAD A ONE
665 84B9 AE 3B 80 PROC2: LDX BPN ;ACTUAL BP #
666 84BC F0 10 BEQ IXCT ;COULD BE FROM PANIC INT
667 84BE 9D 57 80 STA BPCNT-1,X ;STORE COUNT
668 84C1 D0 0B BNE IXCT ;JOIN SS CODE
669
670 84C3 4C 9A 80 PERR: JMP ERR ;HANDY BRANCH LOC
671
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 15
ALBUG.M65
673 ;$X - SINGLE STEP
674
675 84C6 EXEC: CLR BPN ;NO BREAKS IN PROGRESS
(1) 84C6 A9 00
(2) 84C8 8D 3B 80
676 84CB EE 3A 80 INC SNGLF ;SET FLAG
677
678 84CE IXCT: MOV2 PRPC,POINT ;SET START ADDRESS
(1) 84CE AD 2C 80
(1) 84D1 85 E2
(1) 84D3 AD 2D 80
(1) 84D6 85 E3
679 84D8 20 7E 89 CALL CALCAD ;GET LENGHT, EA, FORMAT
680 84DB MOV2 INBUF,XBTARG ;SET EA TO BRANCH TARGET
(1) 84DB A5 E0
(1) 84DD 8D 7B 85
(1) 84E0 A5 E1
(1) 84E2 8D 7C 85
681 84E5 A2 EA LDX #$EA ;GET NOP
682 84E7 8E 50 85 STX IOPC+1 ;INIT FOR 1 BYTE INSTR
683 84EA 8E 51 85 STX IOPC+2
684 84ED B1 E2 LDA (POINT),Y ;GET OPCODE
685 84EF D0 01 BNE 5$ ;CONVERT "BRK" INTO "NOP"
686 84F1 8A TXA
687 84F2 8D 4F 85 5$: STA IOPC
688 84F5 AD 2E 80 LDA LENGTH ;LENGTH OF INSTR
689 84F8 F0 3D BEQ IXCT1 ;1 BYTE - GO NOW
690 84FA 20 D0 87 CALL INCPT ;MOVE TO NEXT BYTE
691 84FD AD 2F 80 LDA PFRMT ;CHECK FOR BRANCH
692 8500 C9 1D CMP #$1D ; INSTR
693 8502 D0 07 BNE IXCT3 ;NOT BRANCH
694 8504 A9 1B LDA #XCTBR-IOPC-2 ;BRANCH - SET UP DISPLACEMENT
695 8506 8D 50 85 STA IOPC+1 ;STORE IN OFFSET BYTE
696 8509 D0 2C BNE IXCT1 ;JOIN COMMON EXIT
697
698 850B B1 E2 IXCT3: LDA (POINT),Y ;GET NEXT BYTE
699 850D 8D 50 85 STA IOPC+1 ;STORE IN XCT BLOCK
700 8510 AD 2E 80 LDA LENGTH
701 8513 C9 02 CMP #2 ;CHECK FOR 1 OR 2 EXTRA BYTES
702 8515 D0 20 BNE IXCT1 ;ONLY 1 BYTE
703 8517 20 D0 87 CALL INCPT ;MOVE TO NEXT
704 851A B1 E2 LDA (POINT),Y ;GET 3RD AND LAST
705 851C 8D 51 85 STA IOPC+2
706 851F AD 4F 85 LDA IOPC ;GET OPCODE BYTE
707 8522 C9 20 CMP #$20 ;IS IT "JSR"?
708 8524 D0 11 BNE IXCT1 ;BRANCH IF NOT
709 8526 A6 E8 LDX SP ;GET SAVED STACK POINTER
710 8528 9A TXS ;SET STACK
711 8529 A5 E3 LDA POINT+1 ;YES - SETUP RETURN PC
712 852B 48 PHA
713 852C A5 E2 LDA POINT
714 852E 48 PHA
715 852F BA TSX ;SAVE UPDATED POINTER
716 8530 86 E8 STX SP ; FOR PROCEED
717 8532 A9 4C LDA #$4C ;CHANGE INTO "JMP"
718 8534 8D 4F 85 STA IOPC
719 8537 20 D0 87 IXCT1: CALL INCPT ;STEP TO INSTR AFTER THIS ONE
720 853A MOV2 POINT,XNOBR ;SETUP NO BRANCH LOC
(1) 853A A5 E2
(1) 853C 8D 79 85
(1) 853F A5 E3
(1) 8541 8D 7A 85
721 8544 SET2 IOPC,POINT ;SET START ADDR TO IOPC BLOCK
(1) 8544 A9 4F
(1) 8546 85 E2
(1) 8548 A9 85
(1) 854A 85 E3
722 854C 4C A9 83 JMP GO1 ;AND START UP
723
724 ;EXECUTE BLOCK FOR INSTR XCT SIMULATOR
725
726 854F F0 1B IOPC: BEQ XCTBR
727 8551 EA .BYTE $EA ;NOP
728 8552 84 E6 STY YREG ;SAVE NEW STATE AFTER $X
729 8554 86 E5 STX XREG
730 8556 85 E4 STA AC
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 15-1
ALBUG.M65
731 8558 08 PHP
732 8559 68 PLA
733 855A 85 E7 STA PS ;PROCESSOR STATUS
734 855C BA TSX
735 855D 86 E8 STX SP ;STACK POINTER
736 855F XCTNB: MOV2 XNOBR,POINT ;NO BRANCH OCCURED
(1) 855F AD 79 85
(1) 8562 85 E2
(1) 8564 AD 7A 85
(1) 8567 85 E3
737 8569 4C F3 88 JMP BRKY
738
739 856C XCTBR: MOV2 XBTARG,POINT ;BRANCH OCCURED
(1) 856C AD 7B 85
(1) 856F 85 E2
(1) 8571 AD 7C 85
(1) 8574 85 E3
740 8576 4C F3 88 JMP BRKY
741
742 8579 0001 XNOBR: .BLKW 1 ;SAVED POINTERS FOR SINGLE STEP
743 857B 0001 XBTARG: .BLKW 1
744
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 16
ALBUG.M65
746 ;$Q - DISASSEMBLE CODE
747
748 857D 20 41 86 DISASS: CALL INTPT ;SET UP POINT
749 8580 20 A4 85 10$: CALL SETOUT ;SET OUTPUT DEVICE
750 8583 8D 2B 80 STA CF ; RETURNS LINES/PAGE
751 8586 20 85 87 20$: CALL CRLFS ;PUT OUT CARRIAGE RETURN LINE FEED
752 8589 20 1E 87 CALL PRTSLS ;GO PRINT A LINE
753 858C 20 58 86 CALL ENDCHK ;CHECK TO SEE IF FINISHED
754 858F AD 2E 80 LDA LENGTH ;GET LENGTH OF INSTRUCTION
755 8592 18 CLC ;ONE ALREADY ADDED AT ENDCHK
756 8593 20 04 8A CALL PCADJ3 ;POINT TO NEXT INSTRUCTION
757 8596 85 E2 STA POINT ;SAVE UPDATED ADDRESS
758 8598 84 E3 STY POINT+1
759 859A CE 2B 80 DEC CF ;ACCOUNT FOR LINE
760 859D D0 E7 BNE 20$ ;GO DO ANOTHER INSTRUCTION
761 859F 20 DB 86 CALL PAGEWT ;GO WAIT FOR GO AHEAD
762 85A2 D0 DC BNE 10$ ;GO DO ANOTHER PAGE
763
764 ;ROUTINE TO SETUP FOR OUTPUT - CHECK PNTF FOR PRINTER
765
766 85A4 AD 3E 80 SETOUT: LDA PNTF ;WANT PRINTER?
767 85A7 F0 06 BEQ 10$
768 85A9 20 E0 87 CALL OPENP ;YES - OPEN IT IF NOT OPEN ALREADY
769 85AC A9 37 LDA #LPP ;RETURN LINES/PAGE
770 85AE 60 RET
771
772 85AF A9 18 10$: LDA #LNSCR ;LINE/SCREEN (EDITOR)
773 85B1 60 RET
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 17
ALBUG.M65
775 ;$S - SEARCH FOR ADDRESS
776
777 85B2 20 6A 86 SEARCH: CALL GETVAL ;GET A WORD
778 85B5 MOV2 INBUF,VEB ;SAVE VALUE SEARCHING FOR
(1) 85B5 A5 E0
(1) 85B7 8D 30 80
(1) 85BA A5 E1
(1) 85BC 8D 31 80
779 85BF 20 3E 86 CALL INTPTC ;SET UP ADDRESSES
780 85C2 20 4C 86 CALL DECPT ;DECREMENT IT BY ONE
781 85C5 A0 00 10$: LDY #0 ;SET UP INDEX
782 85C7 B1 E2 LDA (POINT),Y ;GET FIRST BYTE
783 85C9 CD 30 80 CMP VEB ;DOES IT MATCH
784 85CC D0 22 BNE 20$ ;NO
785 85CE C8 INY ;BUMP POINTER
786 85CF B1 E2 LDA (POINT),Y ;GET SECOND BYTE
787 85D1 CD 31 80 CMP VEB+1 ;DOES IT MATCH
788 85D4 D0 1A BNE 20$ ;NO
789 85D6 20 8A 87 CALL PRTSPT ;PRINT THE ADDRESS
790 85D9 A9 2F LDA #'/ ;PRINT SEPERATOR
791 85DB 20 6D 87 CALL OUTSCH ;PRINT IT
792 85DE 20 6B 87 CALL OUTSSP ;PUT OUT A SPACE
793 85E1 AD 31 80 LDA VEB+1 ;GET HIGH BYTE
794 85E4 20 91 87 CALL PRTSBY ;PRINT THE BYTE
795 85E7 AD 30 80 LDA VEB ;GET LOW BYTE
796 85EA 20 91 87 CALL PRTSBY ;PRINT IT
797 85ED 4C 0E 86 JMP 30$ ;GO DO CARRIAGE RETURN LINE FEED
798
799 85F0 20 7E 89 20$: CALL CALCAD ;GET EFFECTIVE ADDRESS OF INSTRUCTION
800 85F3 A5 E0 LDA INBUF ;GET LOW BYTE
801 85F5 CD 30 80 CMP VEB ;DOES IT MATCH
802 85F8 D0 17 BNE 40$ ;NO
803 85FA A5 E1 LDA INBUF+1 ;GET HIGH BYTE
804 85FC CD 31 80 CMP VEB+1 ;DOES IT MATCH
805 85FF D0 10 BNE 40$ ;NO
806 8601 20 1E 87 CALL PRTSLS ;GO PRINT THE CONTENTS
807 8604 AD 2F 80 LDA PFRMT ;
808 8607 C9 1D CMP #$1D ;CHECK TO SEE IF IT WAS A BRANCH
809 8609 F0 03 BEQ 30$ ;YES. NO NEED TO BUMP TWO
810 860B 20 D0 87 CALL INCPT ;BUMP POINTER SO WE DO NOT GET ADDRESS AGAIN
811 860E 20 85 87 30$: CALL CRLFS ;PUT OUT CARRIAGE RETURN LINE FEED
812 8611 20 58 86 40$: CALL ENDCHK ;ARE WE FINISHED
813 8614 4C C5 85 JMP 10$ ;NO
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 18
ALBUG.M65
815 ;$T - TYPE OUT MEMORY IN ASCII
816
817 8617 20 3E 86 TYPE: CALL INTPTC ;SET UP ADDRESSES
818 861A A0 00 10$: LDY #0 ;SET UP FOR INDEXING
819 861C B1 E2 LDA (POINT),Y ;GET A CHARACTER
820 861E 20 6D 87 CALL OUTSCH ;PRINT THE CHARACTER
821 8621 20 58 86 CALL ENDCHK ;FINISHED?
822 8624 4C 1A 86 JMP 10$ ;NO
823
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 19
ALBUG.M65
825 ;ROUTINES DEALING WITH POINT
826
827 ;REGISTER CLOSE ROUTINE
828 ;CLOSE LOCATION AND UPDATE IF NECESSARY
829
830 8627 A0 00 CLSE: LDY #0 ;PREPARE TO MODIFY
831 8629 AD 2A 80 LDA ROF ;GET FLAG
832 862C F0 0C BEQ CLSEX ;XFER IF NONE OPEN
833 862E 30 0A BMI CLSEX ; OR SYMBOLIC
834 8630 AD 2B 80 LDA CF ;ANYTHING TYPED?
835 8633 30 05 BMI CLSEX ;NO - DO NOTHING
836 8635 AD 34 80 LDA STARTA ; CURRENT OPEN REG
837 8638 91 E2 STA (POINT),Y ; WITH INPUT VALUE
838 863A 8C 2A 80 CLSEX: STY ROF ;SET REGISTER CLOSED
839 863D 60 RET ;RETURN
840
841
842 ;SET UP POINT FROM THE STARTING ADDRESS
843
844 863E 20 85 87 INTPTC: CALL CRLFS ;PUT OUT CARRIAGE RETURN LINE FEED FIRST
845 8641 INTPT: MOV2 STARTA,POINT
(1) 8641 AD 34 80
(1) 8644 85 E2
(1) 8646 AD 35 80
(1) 8649 85 E3
846 864B 60 RET
847
848
849 ;DECREMENT THE PC
850
851 864C 38 DECPT: SEC ;PREPARE TO DECREMENT POINT
852 864D A5 E2 LDA POINT
853 864F E9 01 SBC #1
854 8651 85 E2 STA POINT
855 8653 B0 02 BCS 10$
856 8655 C6 E3 DEC POINT+1 ;HANDLE BORROW
857 8657 60 10$: RET
858
859
860 ;CHECK TO SEE IF POINT IS AT END YET
861
862 8658 A5 E2 ENDCHK: LDA POINT ;CHECK TO SEE IF FINISHED
863 865A CD 36 80 CMP ENDAD
864 865D A5 E3 LDA POINT+1
865 865F ED 37 80 SBC ENDAD+1
866 8662 B0 03 BCS 20$ ;IF GREATER THAN, FINISHED
867 8664 4C D0 87 JMP INCPT ;INCREMENT THE POINTER
868
869 8667 4C 9D 80 20$: JMP DCD ;FINISHED GO BACK TO MAIN LOOP
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 20
ALBUG.M65
871 ;ROUTINES TO PICK UP VALUES
872
873 ; GET ADDITIONAL VALUE, PROMPT FOR INPUT, ERROR IF NOT
874 ; TERMINATED BY <EOL>
875
876 866A 20 6B 87 GETVAL: CALL OUTSSP ;OUTPUT SPACE
877 866D A9 3A LDA #': ; AND PROMPT
878 866F 20 6D 87 CALL OUTSCH
879 8672 20 7C 86 CALL GETNUM
880 8675 C9 9B CMP #.ATEOL ;TERMINATED PROPERLY?
881 8677 F0 1E BEQ ABTRET ;YES - RETURN
882 8679 4C 9A 80 JMP ERR ;NOPE -ERROR
883
884 ;GET A NUMBER RETURN WITH TERMINATOR IN A
885
886 867C GETNUM: CLR2 INBUF ;CLEAR THE BUFFER
(1) 867C A9 00
(2) 867E 85 E0
(2) 8680 85 E1
887 8682 20 A8 86 CALL PACKCH ;GET A CHARACTER
888 8685 D0 08 BNE ABTCHK ;IF NOT HEX RETURN WITH CHARACTER IN A
889 8687 EE 2B 80 INC CF ;SAY WE HAVE A NUMBER
890 868A 20 A8 86 10$: CALL PACKCH ;GO GET ANOTHER CHARACTER
891 868D F0 FB BEQ 10$ ;IF HEX GO GET ANOTHER CHARACTER
892 ;;; ... ; FALL INTO ABTCHK
893
894 ;CHECK FOR RUBOUT OR BREAK. IF FOUND RETURN TO COMMAND DECODER
895
896 868F C9 7E ABTCHK: CMP #.ATRUB ;RUBOUT
897 8691 F0 05 BEQ ABORT ;ABORT COMMAND
898 8693 C9 80 CMP #BRKABT ;BREAK TYPED
899 8695 F0 01 BEQ ABORT
900 8697 60 ABTRET: RET
901
902 8698 ABORT: TYPE EXES ;PUT OUT XXX
(1) 8698 A2 A2
(1) 869A A0 86
(1) 869C 20 85 F3
903 869F 4C A3 80 JMP DCD4
904
905 86A2 20 20 58 EXES: .ASCII " XXX"<.ATEOL>
86A5 58 58 9B
906
907 ;GET A CHARACTER AND PACK IT
908
909 86A8 20 F0 86 PACKCH: CALL GETSCH ;GET THE CHARACTER
910 86AB C9 3A CMP #'9+1 ;CAN IT BE A NUMBER
911 86AD 30 10 BMI PACK ;YES GO TRY TO PACK IT
912 86AF C9 41 CMP #'A ;IS IT A CHARACTER
913 86B1 30 0A BMI 10$ ;NO. INVALID CHARACTER RETURN
914 86B3 C9 7E CMP #.ATRUB ;RUBOUT
915 86B5 F0 06 BEQ 10$ ;YES. INVALID CHARACTER RETURN
916 86B7 29 DF AND #@337 ;GET RID OF LOWERCASE BIT
917 86B9 C9 47 CMP #'F+1 ;IS IT G OR LARGER
918 86BB 30 02 BMI PACK ;NO. GO PACK IT
919 86BD A8 10$: TAY ;SIGNAL ILLEGAL CHARACTER
920 86BE 60 RET
921
922 86BF C9 30 PACK: CMP #'0 ;CHECK FOR HEX
923 86C1 30 17 BMI PACKX
924 86C3 C9 40 CMP #'A-1 ;ADJUST FOR A-F
925 86C5 30 03 BMI 10$
926 86C7 18 CLC ;BY ADDING OFFSET
927 86C8 69 09 ADC #$09
928 86CA 2A 10$: ROL A ;SHIFT IN
929 86CB 2A ROL A
930 86CC 2A ROL A
931 86CD 2A ROL A
932 86CE A0 04 LDY #$04 ;4 MORE SHIFTS THRU CARRY
933 86D0 2A 20$: ROL A ; TO MOVE INTO INBUF
934 86D1 26 E0 ROL INBUF
935 86D3 26 E1 ROL INBUF+1 ;RIPPLE BIT THROUGH
936 86D5 88 DEY ;COUNT LOOP
937 86D6 D0 F8 BNE 20$
938 86D8 A9 00 LDA #$00 ;RETURN A = 0 IF OK NUMBER
939 86DA 60 PACKX: RET
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 20-1
ALBUG.M65
940
941 ;WAIT FOR A CHARACTER TO BE TYPED IF IT IS A RUBOUT RETURN TO COMMAND
942 ;DECODER
943
944 86DB AD 3D 80 PAGEWT: LDA PIOCB ;ARE WE PRINTING?
945 86DE F0 05 BEQ 10$
946 86E0 A9 0C LDA #@14 ;OUTPUT FF
947 86E2 4C 6D 87 JMP OUTSCH
948
949 86E5 A9 FD 10$: LDA #.ATBEL ;GET BELL
950 86E7 20 6D 87 CALL OUTSCH ;RING IT
951 86EA 20 F0 86 CALL GETSCH ;WAIT FOR CHARACTER
952 86ED 4C 8F 86 JMP ABTCHK ;CHECK FOR ABORT OR PROCEED
953
954 ;ROUTINE TO GET A CARACTER
955 ; RETURNS CHARACTER IN A
956 ; USES Y
957
958 86F0 8E 38 80 GETSCH: STX TEMPX ;SAVE X
959 86F3 8C 39 80 STY TEMPY ; AND Y AROUND O/S
960 86F6 A9 00 LDA #0
961 86F8 85 2A STA ICAX1Z ;CLEAR FLAG
962 86FA 20 E2 F6 CALL KGETCH ;RETURNS STATUS IN Y, CHAR IN A
963 86FD 30 0A BMI 20$ ;DON'T ECHO SPECIAL CHARS
964 86FF C9 7E CMP #.ATRUB ;CHECK BS/DEL KEY
965 8701 F0 0B BEQ 30$ ; RUBOUT DOESN'T ECHO
966 8703 C9 20 CMP #.CHSP ;CHECK FOR CONTROLS
967 8705 B0 6C BCS OUTSCN ; ECHO IF NOT
968 8707 90 05 BCC 30$ ;RETURN CHAR - NO ECHO
969
970 8709 C0 80 20$: CPY #BRKABT ;BREAK KEY TYPED?
971 870B D0 01 BNE 30$
972 870D 98 TYA ;YES - RETURN BREAK FLAG
973 870E AE 38 80 30$: LDX TEMPX ;RESTORE
974 8711 AC 39 80 LDY TEMPY
975 8714 60 RET ; ELSE RETURN
976
977 ;ROUTINE TO GET TWO HEX CARACTERS INTO AC
978 ; RETURNS CHARACTER IN A
979 ; X PRESERVED Y RETURNED = 0
980
981 8715 20 A8 86 GETSBY: CALL PACKCH ;GET A CHARACTER
982 8718 20 A8 86 CALL PACKCH ;GET ANOTHER CHARACTER
983 871B A5 E0 LDA INBUF ;LOAD UP BYTE
984 871D 60 RET
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 21
ALBUG.M65
986 ;GENERAL PURPOSE PRINTING ROUTIMES
987
988 ;PRINT LOCATION AND IT'S CONTENETS IF FORM SPECIFIED BY ROF
989
990 871E A9 FF PRTSLS: LDA #$FF ;SET THE TYPEOUT MODE BACK
991 8720 8D 2A 80 STA ROF
992 8723 A2 2F LDX #'/ ;SLASH
993 8725 20 8A 87 PRTSLC: CALL PRTSPT ;PRINT CONTENTS OF POINT
994 8728 8A TXA ;GET CHAR BACK
995 8729 20 6D 87 CALL OUTSCH
996 872C 20 6B 87 CALL OUTSSP ; AND A SPACE
997 ;;; ... ; FALL INTO PRTSCN
998
999 ;PRINT OUT CONTENTS OF CURRENT LOCATION IN FORM SPECIFIED BY ROF
1000
1001 872F A0 00 PRTSCN: LDY #0 ;SET FOR GLOBAL INDEX
1002 8731 B1 E2 LDA (POINT),Y ;GET CURRENT LOCATION IN A
1003 8733 8D 34 80 STA STARTA ;SAVE FOR QUOTE OR EQUAL
1004 8736 AE 2A 80 LDX ROF ;SEE WHAT KIND
1005 8739 30 06 BMI 20$ ;BR IF SYMBOLIC
1006 873B 20 91 87 CALL PRTSBY ;PRINT CONTENTS
1007 873E 4C 6B 87 10$: JMP OUTSSP ;AWAIT NEXT REQUEST
1008
1009 8741 20 05 89 20$: CALL DSMBL ;PRINT SYMBOLIC
1010 8744 4C 3E 87 JMP 10$ ; AND RETURN TO CMD LOOP
1011
1012 ;DUMP NUMBER OF LOCATIONS IN A TO SCREEN
1013
1014 8747 8D 2F 80 DMPLIN: STA PFRMT ;SAVE IT
1015 874A 20 62 87 CALL PRBLNK ;SPACE OVER 2
1016 874D F0 06 BEQ 20$ ;DO NOT INCREMENT POINTER FIRST TIME
1017
1018 874F 20 D0 87 10$: CALL INCPT ;INCREMENT THE POINTER
1019 8752 20 6B 87 CALL OUTSSP ;PRINT BLANK
1020 8755 A0 00 20$: LDY #0 ;SET UP FOR INDEXING
1021 8757 B1 E2 LDA (POINT),Y ;GET LOCATION
1022 8759 20 91 87 CALL PRTSBY ;PRINT IT
1023 875C CE 2F 80 DEC PFRMT ;ACCOUNT FOR CHARACTER
1024 875F D0 EE BNE 10$ ;NOT FINISHED GO DO MORE
1025 8761 60 RET
1026
1027 ;OUTPUT NUMBER OF BLANKS IN X
1028
1029 8762 A2 02 PRBLNK: LDX #$2
1030 8764 20 6B 87 PRBL2: CALL OUTSSP
1031 8767 CA DEX
1032 8768 D0 FA BNE PRBL2 ;LOOP TILL COUNT = 0
1033 876A 60 RET
1034
1035
1036 ;ROUTINE TO OUTPUT CHARACTER TO OUTPUT PORT
1037 ; CHARACTER IN A
1038
1039 ; USES Y AND RETURNS CHARACTER IN A
1040
1041 876B A9 20 OUTSSP: LDA #.CHSP ;LOAD UP A BLANK
1042 876D 8E 38 80 OUTSCH: STX TEMPX ;SAVE X & Y AROUND O/S CALLS
1043 8770 8C 39 80 STY TEMPY
1044 8773 48 OUTSCN: PHA ;SAVE THE CHARACTER
1045 8774 A8 TAY ; AND MOVE TO Y
1046 8775 AE 3D 80 LDX PIOCB ;GET IOCB INDEX
1047 8778 A9 0B LDA #PUTCHR ;1 CHAR OUTPUT
1048 877A 20 10 88 CALL CIOC ;OUTPUT TO EDITOR/PRINTER
1049 877D AE 38 80 LDX TEMPX ;RESTORE X
1050 8780 AC 39 80 LDY TEMPY ;RESTORE Y
1051 8783 68 PLA
1052 8784 60 RET
1053
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 22
ALBUG.M65
1055 ;ROUTINE TO WRITE OUT CARRIAGE RETURN LINE FEED
1056 ; USES A AND Y
1057
1058 8785 A9 9B CRLFS: LDA #.ATEOL
1059 8787 4C 6D 87 JMP OUTSCH ;WRITE IT OUT AND RETURN
1060
1061 ;ROUTINE TO PRINT CURRENT LOCATION
1062 ; PRINTS POINT
1063 ; USES A AND Y
1064
1065 878A A5 E3 PRTSPT: LDA POINT+1 ;GET HIGH ORDER BYTE
1066 878C 20 91 87 CALL PRTSBY
1067 878F A5 E2 LDA POINT ;GET LOW ORDER BYTE
1068 ;;; ... ;FALL INTO PRTSBY
1069
1070 ;ROUTINE TO PRINT BYTE AS TWO HEX DIGITS
1071 ; BYTE IS IN A
1072
1073 8791 48 PRTSBY: PHA ;SAVE THE BYTE
1074 8792 4A LSR A ;GET HIGH ORDER FOUR BITS
1075 8793 4A LSR A
1076 8794 4A LSR A
1077 8795 4A LSR A
1078 8796 20 9A 87 CALL HEXSTA ;GO CONVERT IT TO HEX
1079 8799 68 PLA ;GET THE ORGINAL BYTE BACK
1080 ;;; ... ; FALL INTO HEXSTA
1081
1082
1083 ;ROUTINE TO CONVERT A HEX DIGIT TO ASCII
1084 ; DIGIT IS IN A
1085
1086 879A 29 0F HEXSTA: AND #$0F ;GET JUST ONE DIGIT
1087 879C C9 0A CMP #$0A ;IS IT A DECIMAL DIGIT
1088 879E 18 CLC ;CLEAR THE CARRY
1089 879F 30 02 BMI HEXST1 ;IF NEGATIVE IT IS A DECIMAL DIGIT
1090 87A1 69 07 ADC #$07 ;ADD IN OFFSET TO GET A-F
1091 87A3 69 30 HEXST1: ADC #$30 ;CONVERT TO ASCII
1092 87A5 4C 6D 87 JMP OUTSCH ;GOT WRITE CHARACTER AND RETURN
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 23
ALBUG.M65
1094 ; MISC ROUTINES
1095
1096 87A8 D8 INITS: CLD ;CLEAR DECIMAL MODE
1097 87A9 A9 02 LDA #LEDGE ;SET DEFAULT MARGINS
1098 87AB 85 52 STA LMARGN
1099 87AD A9 27 LDA #REDGE
1100 87AF 85 53 STA RMARGN
1101 87B1 A9 94 LDA #$94 ;SETUP BACKGROUND COLOR
1102 87B3 8D C8 02 STA COLOR4 ;TO BE SAME AS FOREGROUND
1103 87B6 4C 2E 88 JMP CLOSEP ;CLOSE PRINTER IF OPEN
1104
1105 ;SET UP VEB AREA
1106
1107 87B9 A9 AD INTSVB: LDA #$AD ;LDA OP CODE
1108 87BB 8D 30 80 INTIVB: STA VEB
1109 87BE AD 34 80 INTVEB: LDA STARTA ;SET UP SUB
1110 87C1 8D 31 80 STA VEB+1
1111 87C4 AD 35 80 LDA STARTA+1
1112 87C7 8D 32 80 STA VEB+2
1113 87CA A9 60 LDA #$60 ;"RTS"
1114 87CC 8D 33 80 STA VEB+3
1115 87CF 60 RET
1116
1117 ;ROUTINE TO INCRENT POINT
1118
1119 87D0 INCPT: INC2 POINT
(1) 87D0 E6 E2
(1) 87D2 D0 02
(1) 87D4 E6 E3
1120 87D6 60 RET
1121
1122 ;ROUTINE TO INCREMENT ADDRS IN VEB
1123
1124 87D7 INCVEB: INC2 VEB+1
(1) 87D7 EE 31 80
(1) 87DA D0 03
(1) 87DC EE 32 80
1125 87DF 60 INCRET: RET
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 24
ALBUG.M65
1127 ;PRINTER ROUTINES
1128
1129 87E0 AD 3D 80 OPENP: LDA PIOCB ;CHECK IF ALREADY OPEN
1130 87E3 D0 FA BNE INCRET ;YES - DON'T REOPEN
1131 87E5 A2 10 LDX #$10 ;START AT IOCB#1
1132 87E7 BD 40 03 5$: LDA ICHID,X ;GET ID
1133 87EA C9 FF CMP #$FF ;FREE?
1134 87EC F0 0E BEQ THSONE
1135 87EE E0 70 CPX #$70 ;LAST ONE?
1136 87F0 F0 07 BEQ PNONE
1137 87F2 8A TXA ;STEP INDEX TO NEXT
1138 87F3 18 CLC
1139 87F4 69 10 ADC #$10
1140 87F6 AA TAX ;BACK TO X
1141 87F7 D0 EE BNE 5$
1142
1143 87F9 4C 9A 80 PNONE: JMP ERR ;NO FREE IOCB'S
1144
1145 ;FOUND FREE IOCB (INDEX IN X)
1146
1147 87FC 8E 3D 80 THSONE: STX PIOCB ;SAVE IOCB INDEX
1148 87FF A9 08 LDA #OPNOT ;OPEN FOR OUTPUT
1149 8801 9D 4A 03 STA ICAX1,X
1150 8804 SET2 PDEV,ICBAL,X ;POINT TO DEVICE TEXT
(1) 8804 A9 3C
(1) 8806 9D 44 03
(1) 8809 A9 88
(1) 880B 9D 45 03
1151 880E A9 03 LDA #OPEN ;OPEN COMMAND
1152 8810 9D 42 03 CIOC: STA ICCOM,X ;STORE COMMAND
1153 8813 A9 00 LDA #0 ;SET LENGTH TO ZERO
1154 8815 9D 48 03 STA ICBLL,X
1155 8818 9D 49 03 STA ICBLH,X
1156 881B 98 TYA ;MIGHT HAVE CHARACTER
1157 881C 20 56 E4 CALL CIOV ;INVOKE O/S
1158 881F 8C 03 03 STY DSTATS ;PUT COMPLETION CODE HERE
1159 8822 10 BB BPL INCRET ;RETURN IF NO ERROR
1160 8824 C0 80 CPY #BRKABT ;BREAK TYPED?
1161 8826 F0 03 BEQ 10$
1162 8828 4C 52 83 JMP IOCERR ;COMMON ERROR HANDLER
1163
1164 882B 4C 98 86 10$: JMP ABORT ;ABORT I/O - RETURN TO TOP LEVEL
1165
1166 ; CLOSE PRINTER IOCB
1167
1168 882E AE 3D 80 CLOSEP: LDX PIOCB ;SETUP IOCB INDEX
1169 8831 F0 AC BEQ INCRET ;RETURN IF NONE
1170 8833 CLR PIOCB ;FLAG NO PRINTER
(1) 8833 A9 00
(2) 8835 8D 3D 80
1171 8838 A9 0C LDA #CLOSE ;CLOSE COMMAND
1172 883A D0 D4 BNE CIOC ; INVOKE CIO
1173
1174 883C 50 3A 9B PDEV: .ASCII "P:"<.ATEOL>
1175
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 25
ALBUG.M65
1177 ;GENERAL BREAKPOINT ROUTINES
1178
1179 ;ROUTINE TO REMOVE BREAKPOINTS
1180
1181 883F A2 07 REMB: LDX #MAXBP-1 ;COUNT OF THINGS TO DO
1182 8841 BD 50 80 5$: LDA BPINS,X ;GET INSTR OR ZERO
1183 8844 F0 05 BEQ 10$ ;NO BP IF ZERO
1184 8846 20 4F 88 CALL SETA ;SET UP ADDRS
1185 8849 91 E0 STA (INBUF),Y ;STORE INSTR
1186 884B CA 10$: DEX
1187 884C 10 F3 BPL 5$ ;LOOP OVER ALL
1188 884E 60 RET ;RETURN
1189
1190 ;SETUP ADDRS OF GIVEN BREAKPOINT FOR INDIRECT
1191 ;RETURNS INBUF WITH BPLOC,X , Y := 0
1192 ;PRESERVES AC
1193
1194 884F BC 60 80 SETA: LDY BPLOCL,X ;GET LOW ADDRS BYTE
1195 8852 84 E0 STY INBUF ;USE THIS AS TEMP
1196 8854 BC 68 80 LDY BPLOCH,X ;GET HIGH ADDRS BYTE
1197 8857 84 E1 STY INBUF+1
1198 8859 A0 00 LDY #0 ;SET FOR GLOBAL INDIRECT
1199 885B 60 RET ;RETURN
1200
1201 ;ROUTINE TO INSERT BREAKPOINTS
1202
1203 885C A2 07 INSB: LDX #MAXBP-1 ;DO ALL
1204 885E BD 50 80 5$: LDA BPINS,X ;SEE IF ACTIVE
1205 8861 F0 0C BEQ 10$ ;SKIP IF NO BP
1206 8863 20 4F 88 CALL SETA ;SET UP ADDRS
1207 8866 B1 E0 LDA (INBUF),Y ;GET OLD INSTR
1208 8868 9D 50 80 STA BPINS,X ;SAVE OLD INSTR
1209 886B A9 00 LDA #0 ;PUT BREAK IN PLACE
1210 886D 91 E0 STA (INBUF),Y ;...
1211 886F CA 10$: DEX
1212 8870 10 EC BPL 5$ ;LOOP TILL DONE
1213 8872 60 RET ;RETURN
1214
1215 ;INTERUPT SERVICES
1216
1217 ;IRQ - <BRK> INSTRUCTION OR ACTUAL APPLICATION INT.
1218
1219 8873 68 BREAK: PLA ;AC IS ON STACK
1220 8874 85 E4 STA AC ;SAVE ACCUM
1221 8876 68 PLA ;PROCESSOR STATUS
1222 8877 85 E7 STA PS
1223 8879 84 E6 STY YREG ;SAVE INDEX REGS
1224 887B 86 E5 STX XREG
1225 887D 68 PLA ;PC LOW
1226 887E 38 SEC ;DECREMENT PC TO REAL LOC
1227 887F E9 02 SBC #2 ;ADJUST PC FOR ACTUAL BP LOC
1228 8881 8D 2C 80 10$: STA PRPC ;SAVE HERE FOR $P
1229 8884 85 E2 STA POINT ;SAVE HERE FOR EXAMINE
1230 8886 68 PLA ;PC HIGH
1231 8887 B0 02 BCS 20$ ;CHECK BORROW
1232 8889 E9 00 SBC #0 ;ADJUST BY 1
1233 888B 8D 2D 80 20$: STA PRPC+1
1234 888E 85 E3 STA POINT+1
1235 8890 BA TSX ;GET STACK PNTR
1236 8891 86 E8 STX SP ; SAVE IT AWAY
1237 8893 20 3F 88 CALL REMB ;REMOVE BREAKPOINTS NOW
1238 8896 A2 08 LDX #MAXBP ;SEARCH FOR BPN
1239 8898 BD 4F 80 25$: LDA BPINS-1,X ;ACTIVE BP?
1240 889B F0 08 BEQ 30$ ;NO - SKIP TO NEXT
1241 889D AD 2D 80 LDA PRPC+1 ;GET PC HIGH
1242 88A0 DD 67 80 CMP BPLOCH-1,X ;MATCH?
1243 88A3 F0 08 BEQ 35$ ;YES - TRY FOR LOW
1244 88A5 CA 30$: DEX ;STEP TO NEXT
1245 88A6 D0 F0 BNE 25$ ; MORE TO DO
1246 88A8 8E 3B 80 STX BPN ;SIGNAL NO B.P.
1247 88AB F0 25 BEQ BRKX ;NONE FOUND (MAYBE PANIC)
1248 ;..
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 26
ALBUG.M65
1250 ;..
1251
1252 88AD AD 2C 80 35$: LDA PRPC ;GET PC LOW
1253 88B0 DD 5F 80 CMP BPLOCL-1,X ;MATCH?
1254 88B3 D0 F0 BNE 30$ ;NO - KEEP LOOKING
1255
1256 ;ACTUAL BPN IN X
1257
1258 88B5 8E 3B 80 STX BPN ;SAVE BPN
1259 88B8 BD 57 80 LDA BPCNT-1,X ;BREAT THIS TIME? (0)
1260 88BB F0 15 BEQ BRKX ;BREAK IF ZERO
1261 88BD DE 57 80 DEC BPCNT-1,X ;COUNT THIS TIME
1262 88C0 F0 10 BEQ BRKX ; AND DO AUTO PROC (IF .NE. 0)
1263 88C2 CLR SNGLF ; NOT SINGLE STEP
(1) 88C2 A9 00
(2) 88C4 8D 3A 80
1264 88C7 SETXA IXCT ;EXIT THROUGH HERE
(1) 88C7 A2 CE
(1) 88C9 A9 84
1265 88CB 48 BRKRTI: PHA ;SAVE HIGH PC
1266 88CC 8A TXA ;GET LOW
1267 88CD 48 PHA ;SAVE IT TOO
1268 88CE A5 E7 LDA PS
1269 88D0 48 PHA ;CURRENT PROCESSOR STATUS
1270 88D1 40 RTI ;DISMISS TO ROUTINE
1271
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 27
ALBUG.M65
1273 ;HERE TO ENTER BREAKPOINT - CLEAR SINGLE STEP FLAG
1274
1275 88D2 BRKX: CLR SNGLF ; CLEAR SS FLAG
(1) 88D2 A9 00
(2) 88D4 8D 3A 80
1276 88D7 SETXA DOBRK
(1) 88D7 A2 DD
(1) 88D9 A9 88
1277 88DB D0 EE BNE BRKRTI ;EXIT INT TO DOBRK
1278
1279 88DD 20 85 87 DOBRK: CALL CRLFS ;PUT OUT A CR/LF
1280 88E0 A9 42 LDA #'B ;PRINT BN;ADDRS
1281 88E2 20 6D 87 CALL OUTSCH
1282 88E5 AD 3B 80 LDA BPN ;MAYBE 0
1283 88E8 20 9A 87 CALL HEXSTA ;TYPE LOW 4 BITS
1284 88EB A9 3B LDA #';
1285 88ED 20 6D 87 CALL OUTSCH
1286 88F0 4C BC 81 JMP LFDS1 ;GO PRINT OUT ADDRESS AND INSTR.
1287
1288 88F3 BRKY: MOV2 POINT,PRPC ;SINGLE STEP ENTRY - POINT HAS PC
(1) 88F3 A5 E2
(1) 88F5 8D 2C 80
(1) 88F8 A5 E3
(1) 88FA 8D 2D 80
1289 88FD AD 3A 80 LDA SNGLF ;WAS THIS SINGLE STEP?
1290 8900 D0 DB BNE DOBRK ; SIMULATE BREAK IF $X
1291 8902 4C 93 83 JMP GO2 ;ELSE - JUST PROCEED
1292
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 28
ALBUG.M65 6502 DISASSEMBLER
1294 .SBTTL 6502 DISASSEMBLER
1295
1296
1297 8905 20 7E 89 DSMBL: CALL CALCAD ;CALCULATE EFFECTIVE ADDRESS
1298 8908 48 PHA ;SAVE MNEMONIC TABLE INDEX
1299 8909 B1 E2 PROP: LDA (POINT),Y ;GET OP AND PRINT IT
1300 890B 20 91 87 CALL PRTSBY
1301 890E A2 01 LDX #$1 ;ONE SPACE
1302 8910 20 64 87 10$: CALL PRBL2
1303 8913 CC 2E 80 CPY LENGTH ;PRINT INSTR (1 TO 3 BYTES)
1304 8916 C8 INY ; IN A 12-CHAR FIELD
1305 8917 90 F0 BCC PROP
1306 8919 A2 03 LDX #$3 ;CHAR COUNT FOR MNEMONIC PRINT
1307 891B C0 04 CPY #$4
1308 891D 90 F1 BCC 10$
1309 891F 68 PLA ;RECOVER MNEMONIC INDEX
1310 8920 A8 TAY
1311 8921 B9 6E 8A LDA MNEML,Y
1312 8924 8D 32 80 STA LMNEM ;FETCH 3-CHAR MNEMONIC
1313 8927 B9 AE 8A LDA MNEMR,Y ; (PACKED IN 2 BYTES)
1314 892A 8D 33 80 STA RMNEM
1315 892D A9 00 PRMN1: LDA #$0
1316 892F A0 05 LDY #$5
1317 8931 0E 33 80 PRMN2: ASL RMNEM
1318 8934 2E 32 80 ROL LMNEM ;SHIFT 5 BITS OF CHAR INTO A
1319 8937 2A ROL A ; (CLEARS CARRY)
1320 8938 88 DEY
1321 8939 D0 F6 BNE PRMN2
1322 893B 69 3F ADC #$3F ;ADD '?' OFFSET
1323 893D 20 6D 87 CALL OUTSCH
1324 8940 CA DEX
1325 8941 D0 EA BNE PRMN1
1326 8943 20 62 87 CALL PRBLNK ;PRINT 3 BLANKS
1327 8946 A2 06 LDX #$6 ;COUNT FOR 6 PRINT FORMAT BITS
1328 8948 E0 03 PRADR1: CPX #$3
1329 894A D0 1B BNE PRADR3 ;IF X=3 THEN PRINT ADDRESS VAL
1330 894C AC 2E 80 LDY LENGTH
1331 894F F0 16 BEQ PRADR3 ;NO PRINT IF LENGTH=0
1332 8951 AD 2F 80 LDA PFRMT
1333 8954 C9 E8 CMP #$E8 ;HANDLE REL ADDRESSING MODE
1334 8956 D0 06 BNE PRADR2 ;IF NOT DO NOT ADJUST NUMBER OF BYTES
1335 8958 C8 INY ;IF RELATIVE BRANCH PRINT 2 BYTES
1336 8959 CLR PFRMT ;CLEAR PFRMT
(1) 8959 A9 00
(2) 895B 8D 2F 80
1337 895E B9 DF 00 PRADR2: LDA INBUF-1,Y ;SPECIAL (PRINT TARGET ADDRS)
1338 8961 20 91 87 CALL PRTSBY ;OUTPUT 1 OR 2 BYTE ADDRS
1339 8964 88 DEY ; MSB FIRST
1340 8965 D0 F7 BNE PRADR2
1341 8967 0E 2F 80 PRADR3: ASL PFRMT ;TEST NEXT PRINT FORMAT BIT
1342 896A 90 0E BCC PRADR4 ;IF 0, DON'T PRINT
1343 896C BD 61 8A LDA CHAR1-1,X ; CORRESPONDING CHARS
1344 896F 20 6D 87 CALL OUTSCH ;OUTPUT 1 OR 2 CHARS
1345 8972 BD 67 8A LDA CHAR2-1,X ; (IF CHAR FROM CHAR2 IS 0,
1346 8975 F0 03 BEQ PRADR4 ; DON'T OUTPUT IT)
1347 8977 20 6D 87 CALL OUTSCH
1348 897A CA PRADR4: DEX
1349 897B D0 CB BNE PRADR1
1350 897D 60 RET
1351
1352
1353 ;SET UP LENGTH, PFRMT AND EFFECTIV ADDRESS
1354 ; RETURNS INDEX INTO MNEMONIC TABLES IN A AND 0 IN Y
1355
1356 897E A0 00 CALCAD: LDY #0 ;SET UP FOR INDEXING
1357 8980 84 E1 STY INBUF+1 ;ZERO HIGH BYTE OF ADDRESS IN CASE ONLY ONE BYTE
1358 8982 B1 E2 LDA (POINT),Y ;GET OPCODE
1359 8984 A8 TAY ;SAVE IN Y
1360 8985 4A LSR A ; EVEN/ODD TEST
1361 8986 90 0B BCC IEVEN
1362 8988 4A LSR A ; TEST B1
1363 8989 B0 17 BCS IERR ; XXXXXX11 INSTR INVALID
1364 898B C9 22 CMP #$22
1365 898D F0 13 BEQ IERR ; 10001001 INSTR INVALID
1366 898F 29 07 AND #$7 ;MASK 3 BITS FOR ADDRS MODE
1367 8991 09 80 ORA #$80 ; ADD INDEXING OFFSET.
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 28-1
ALBUG.M65 6502 DISASSEMBLER
1368 8993 4A IEVEN: LSR A ;LSB INTO CARRY FOR
1369 8994 AA TAX ; LEFT/RIGHT TEST BELOW.
1370 8995 BD 10 8A LDA MODE1,X ;INDEX INTO ADDRS MODE TABLE
1371 8998 B0 04 BCS RTMODE ;IF CARRY SET USE LSD FOR
1372 899A 4A LSR A ; PRINT FORMAT INDEX.
1373 899B 4A LSR A
1374 899C 4A LSR A
1375 899D 4A LSR A ; IF CARRY CLEAR, USE MSD
1376 899E 29 0F RTMODE: AND #$F ;MASK FOR 4-BIT INDEX
1377 89A0 D0 04 BNE GETFMT ; 0 FOR INVALID OPCODES
1378 89A2 A0 80 IERR: LDY #$80 ;SUBSTITUTE $80 FOR INVALID OP.
1379 89A4 A9 00 LDA #$0 ;SET PRINT FORMAT TO 0
1380 89A6 AA GETFMT: TAX
1381 89A7 BD 54 8A LDA MODE2,X ;INDEX INTO PRINT FORMAT TABLE
1382 89AA 8D 2F 80 STA PFRMT ;SAVE FOR ADDRESS FIELD FORMAT
1383 89AD 29 03 AND #$3 ;MASK 2-BIT LENGTH 0 = 1-BYTE,
1384 89AF 8D 2E 80 STA LENGTH ; 1 = 2-BYTE, 2 = 3-BYTE.
1385 89B2 98 TYA ;RESTORE OP CODE
1386 89B3 48 PHA ;SAVE OPCODE ON STACK
1387 89B4 AC 2E 80 LDY LENGTH ;GET LENGTH
1388 89B7 F0 13 BEQ 10$ ;IF ZERO SET CURRENT ADDRESS IN INBUF FOR TAB
1389 89B9 B1 E2 LDA (POINT),Y ;GET FIRST BYTE OF ADDRESS
1390 89BB C0 01 CPY #1 ;IS IT A 2 BYTE INSTRUCTION
1391 89BD D0 16 BNE 20$ ;NO GO PRINT BOTH BYTES
1392 89BF E0 0D CPX #13 ;WAS INDEX TO MODE2 FOR RELATIVE
1393 89C1 D0 17 BNE 30$ ;NO GO DO JUST ONE BYTE
1394 89C3 20 F7 89 CALL RELADR ;GO CALCULATE RELATIVE ADDRESS
1395 89C6 84 E1 STY INBUF+1 ;SAVE HIGH ORDER BYTE
1396 89C8 8A TXA ;GET LOW ORDER BYTE BACK
1397 89C9 4C DA 89 JMP 30$ ;GO FINISH UP
1398
1399 89CC A5 E3 10$: LDA POINT+1 ;GET HIGH ORDER BYTE OF ADDRESS
1400 89CE 85 E1 STA INBUF+1 ;AND SAVE IT
1401 89D0 A5 E2 LDA POINT ;GET LOW BYTE
1402 89D2 4C DA 89 JMP 30$ ;GO SAVE IT AND FINISH
1403
1404 89D5 85 E1 20$: STA INBUF+1 ;SAVE HIGH BYTE OF ADDRESS
1405 89D7 88 DEY ;SET TO GET LOW ORDER BYTE
1406 89D8 B1 E2 LDA (POINT),Y ;GET LOW BYTE
1407 89DA 85 E0 30$: STA INBUF ;SAVE LOW BYTE OF ADDRESS
1408 89DC 68 PLA ;GET OPCODE BACK
1409 89DD A8 TAY ;AND SAVE IT IN Y
1410 89DE 29 8F AND #$8F ;MASK IT FOR 1XXX1010 TEST
1411 89E0 AA TAX ; AND SAVE IT.
1412 89E1 98 TYA ;OPCODE AGAIN
1413 89E2 A0 03 LDY #$3
1414 89E4 E0 8A CPX #$8A
1415 89E6 F0 0B BEQ 60$
1416 89E8 4A 40$: LSR A
1417 89E9 90 08 BCC 60$ ;FORM INDEX INTO MNEMONIC TABLE
1418 89EB 4A LSR A
1419 89EC 4A 50$: LSR A ; 1XXX1010 -> 00101XXX
1420 89ED 09 20 ORA #$20 ; XXXYYY01 -> 00111XXX
1421 89EF 88 DEY ; XXXYYY10 -> 00110XXX
1422 89F0 D0 FA BNE 50$ ; XXXYY100 -> 00100XXX
1423 89F2 C8 INY ; XXXXX000 -> 000XXXXX
1424 89F3 88 60$: DEY
1425 89F4 D0 F2 BNE 40$
1426 89F6 60 RET
1427
1428
1429 ;HERE TO HANDLE RELATIVE BRANCH ADDRS
1430
1431 89F7 20 04 8A RELADR: CALL PCADJ3 ;PCL,H + DISPL + 1 TO A,Y
1432 89FA AA TAX
1433 89FB E8 INX
1434 89FC D0 01 BNE 10$ ; +1 TO X,Y
1435 89FE C8 INY
1436 89FF 60 10$: RET
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 29
ALBUG.M65 6502 DISASSEMBLER
1438 ;ADD LENGTH TO POINT
1439
1440 8A00 AD 2E 80 PCADJ: LDA LENGTH ;0=1-BYTE, 1=2-BYTE, 2=3-BYTE
1441 8A03 38 SEC
1442 8A04 A4 E3 PCADJ3: LDY POINT+1
1443 8A06 AA TAX ;TEST DISPL SIGN (FOR REL
1444 8A07 10 01 BPL 10$ ; BRANCH). EXTEND NEG
1445 8A09 88 DEY ; BY DECREMENTING PCH.
1446 8A0A 65 E2 10$: ADC POINT
1447 8A0C 90 01 BCC 20$ ;PCL+LENGTH (OR DISPL) +1 TO A.
1448 8A0E C8 INY ;CARRY INTO Y (PCH)
1449 8A0F 60 20$: RET
1450
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 30
ALBUG.M65 6502 DISASSEMBLER
1452 ;TABLES
1453
1454 8A10 40 MODE1: .BYTE $40
1455 8A11 02 .BYTE $2
1456 8A12 45 .BYTE $45
1457 8A13 03 .BYTE $3
1458 8A14 D0 .BYTE $D0
1459 8A15 08 .BYTE $8
1460 8A16 40 .BYTE $40
1461 8A17 09 .BYTE $9
1462 8A18 30 .BYTE $30 ;XXXXXXZ0 INSTRS.
1463 8A19 22 .BYTE $22
1464 8A1A 45 .BYTE $45 ; Z=0, LEFT HALF-BYTE
1465 8A1B 33 .BYTE $33 ; Z=1, RIGHT HALF-BYTE
1466 8A1C D0 .BYTE $D0
1467 8A1D 08 .BYTE $8
1468 8A1E 40 .BYTE $40
1469 8A1F 09 .BYTE $9
1470 8A20 40 .BYTE $40
1471 8A21 02 .BYTE $2
1472 8A22 45 .BYTE $45
1473 8A23 33 .BYTE $33
1474 8A24 D0 .BYTE $D0
1475 8A25 08 .BYTE $8
1476 8A26 40 .BYTE $40
1477 8A27 09 .BYTE $9
1478 8A28 40 .BYTE $40
1479 8A29 02 .BYTE $2 ;(WAS 0)
1480 8A2A 45 .BYTE $45 ;(WAS 40)
1481 8A2B B3 .BYTE $B3 ;(WAS B0)
1482 8A2C D0 .BYTE $D0
1483 8A2D 08 .BYTE $8 ;(WAS 0)
1484 8A2E 40 .BYTE $40
1485 8A2F 09 .BYTE $9 ;(WAS 0)
1486 8A30 00 .BYTE $0
1487 8A31 22 .BYTE $22
1488 8A32 44 .BYTE $44
1489 8A33 33 .BYTE $33
1490 8A34 D0 .BYTE $D0
1491 8A35 8C .BYTE $8C
1492 8A36 44 .BYTE $44
1493 8A37 00 .BYTE $0
1494 8A38 11 .BYTE $11
1495 8A39 22 .BYTE $22
1496 8A3A 44 .BYTE $44
1497 8A3B 33 .BYTE $33
1498 8A3C D0 .BYTE $D0
1499 8A3D 8C .BYTE $8C
1500 8A3E 44 .BYTE $44
1501 8A3F 9A .BYTE $9A
1502 8A40 10 .BYTE $10
1503 8A41 22 .BYTE $22
1504 8A42 44 .BYTE $44
1505 8A43 33 .BYTE $33
1506 8A44 D0 .BYTE $D0
1507 8A45 08 .BYTE $8
1508 8A46 40 .BYTE $40
1509 8A47 09 .BYTE $9
1510 8A48 10 .BYTE $10
1511 8A49 22 .BYTE $22
1512 8A4A 44 .BYTE $44
1513 8A4B 33 .BYTE $33
1514 8A4C D0 .BYTE $D0
1515 8A4D 08 .BYTE $8
1516 8A4E 40 .BYTE $40
1517 8A4F 09 .BYTE $9
1518 8A50 62 .BYTE $62
1519 8A51 13 .BYTE $13 ;YYXXXZ01 INSTRS.
1520 8A52 78 .BYTE $78
1521 8A53 A9 .BYTE $A9
1522
1523 8A54 00 MODE2: .BYTE $0 ;ERR
1524 8A55 21 .BYTE $21 ;IMM
1525 8A56 01 .BYTE $1 ;Z-PAG (WAS 81)
1526 8A57 02 .BYTE $2 ;ABS (WAS 82)
1527 8A58 00 .BYTE $0 ;IMPL
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 30-1
ALBUG.M65 6502 DISASSEMBLER
1528 8A59 80 .BYTE $80 ;ACC (WAS 0)
1529 8A5A 59 .BYTE $59 ;(Z-PAG,X)
1530 8A5B 4D .BYTE $4D ;(Z-PAG),Y
1531 8A5C 11 .BYTE $11 ;Z-PAG,X (WAS 91)
1532 8A5D 12 .BYTE $12 ;ABS,X (WAS 92)
1533 8A5E 06 .BYTE $6 ;ABS,Y (WAS 86)
1534 8A5F 4A .BYTE $4A ;(ABS)
1535 8A60 05 .BYTE $5 ;Z-PAG,Y (WAS 85)
1536 8A61 1D .BYTE $1D ;REL (WAS 9D)
1537
1538 8A62 2C CHAR1: .BYTE ', ;COMMA
1539 8A63 29 .BYTE ') ;RPAREN
1540 8A64 2C .BYTE ', ;COMMA
1541 8A65 23 .BYTE '# ;SHARP
1542 8A66 28 .BYTE '( ;LPAREN
1543 8A67 41 .BYTE 'A ;(WAS '$)
1544
1545 8A68 59 CHAR2: .BYTE 'Y
1546 8A69 00 .BYTE 0 ;NULL
1547 8A6A 58 .BYTE 'X
1548 8A6B 00 .BYTE 0 ;(WAS '$)
1549 8A6C 00 .BYTE 0 ;(WAS '$)
1550 8A6D 00 .BYTE 0
1551
1552 8A6E 1C MNEML: .BYTE $1C ;XXXXX000 INSTRS.
1553 8A6F 8A .BYTE $8A
1554 8A70 1C .BYTE $1C
1555 8A71 23 .BYTE $23
1556 8A72 5D .BYTE $5D
1557 8A73 8B .BYTE $8B
1558 8A74 1B .BYTE $1B
1559 8A75 A1 .BYTE $A1
1560 8A76 9D .BYTE $9D
1561 8A77 8A .BYTE $8A
1562 8A78 1D .BYTE $1D
1563 8A79 23 .BYTE $23
1564 8A7A 9D .BYTE $9D
1565 8A7B 8B .BYTE $8B
1566 8A7C 1D .BYTE $1D
1567 8A7D A1 .BYTE $A1
1568 8A7E 00 .BYTE $0
1569 8A7F 29 .BYTE $29
1570 8A80 19 .BYTE $19
1571 8A81 AE .BYTE $AE
1572 8A82 69 .BYTE $69
1573 8A83 A8 .BYTE $A8
1574 8A84 19 .BYTE $19
1575 8A85 23 .BYTE $23
1576 8A86 24 .BYTE $24
1577 8A87 53 .BYTE $53
1578 8A88 1B .BYTE $1B
1579 8A89 23 .BYTE $23
1580 8A8A 24 .BYTE $24
1581 8A8B 53 .BYTE $53
1582 8A8C 19 .BYTE $19
1583 8A8D A1 .BYTE $A1
1584 8A8E 00 .BYTE $0 ;XXXYY100 INSTRS
1585 8A8F 1A .BYTE $1A
1586 8A90 5B .BYTE $5B
1587 8A91 5B .BYTE $5B
1588 8A92 A5 .BYTE $A5
1589 8A93 69 .BYTE $69
1590 8A94 24 .BYTE $24
1591 8A95 24 .BYTE $24
1592 8A96 AE .BYTE $AE ;1XXX1010 INSTRS.
1593 8A97 AE .BYTE $AE
1594 8A98 A8 .BYTE $A8
1595 8A99 AD .BYTE $AD
1596 8A9A 29 .BYTE $29
1597 8A9B 00 .BYTE $0
1598 8A9C 7C .BYTE $7C
1599 8A9D 00 .BYTE $0
1600 8A9E 15 .BYTE $15 ;XXXYYY10 INSTRS.
1601 8A9F 9C .BYTE $9C
1602 8AA0 6D .BYTE $6D
1603 8AA1 9C .BYTE $9C ;(WAS 0)
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 30-2
ALBUG.M65 6502 DISASSEMBLER
1604 8AA2 A5 .BYTE $A5
1605 8AA3 69 .BYTE $69
1606 8AA4 29 .BYTE $29
1607 8AA5 53 .BYTE $53
1608 8AA6 84 .BYTE $84 ;XXXYYY01 INSTRS.
1609 8AA7 13 .BYTE $13
1610 8AA8 34 .BYTE $34
1611 8AA9 11 .BYTE $11
1612 8AAA A5 .BYTE $A5
1613 8AAB 69 .BYTE $69
1614 8AAC 23 .BYTE $23
1615 8AAD A0 .BYTE $A0
1616
1617 8AAE D8 MNEMR: .BYTE $D8 ;XXXXX000 INSTRS.
1618 8AAF 62 .BYTE $62
1619 8AB0 5A .BYTE $5A
1620 8AB1 48 .BYTE $48
1621 8AB2 26 .BYTE $26
1622 8AB3 62 .BYTE $62
1623 8AB4 94 .BYTE $94
1624 8AB5 88 .BYTE $88
1625 8AB6 54 .BYTE $54
1626 8AB7 44 .BYTE $44
1627 8AB8 C8 .BYTE $C8
1628 8AB9 54 .BYTE $54
1629 8ABA 68 .BYTE $68
1630 8ABB 44 .BYTE $44
1631 8ABC E8 .BYTE $E8
1632 8ABD 94 .BYTE $94
1633 8ABE 00 .BYTE $0
1634 8ABF B4 .BYTE $B4
1635 8AC0 08 .BYTE $8
1636 8AC1 84 .BYTE $84
1637 8AC2 74 .BYTE $74
1638 8AC3 B4 .BYTE $B4
1639 8AC4 28 .BYTE $28
1640 8AC5 6E .BYTE $6E
1641 8AC6 74 .BYTE $74
1642 8AC7 F4 .BYTE $F4
1643 8AC8 CC .BYTE $CC
1644 8AC9 4A .BYTE $4A
1645 8ACA 72 .BYTE $72
1646 8ACB F2 .BYTE $F2
1647 8ACC A4 .BYTE $A4
1648 8ACD 8A .BYTE $8A
1649 8ACE 00 .BYTE $0 ;XXXYY100 INSTRS.
1650 8ACF AA .BYTE $AA
1651 8AD0 A2 .BYTE $A2
1652 8AD1 A2 .BYTE $A2
1653 8AD2 74 .BYTE $74
1654 8AD3 74 .BYTE $74
1655 8AD4 74 .BYTE $74
1656 8AD5 72 .BYTE $72
1657 8AD6 44 .BYTE $44 ;1XXX1010 INSTRS.
1658 8AD7 68 .BYTE $68
1659 8AD8 B2 .BYTE $B2
1660 8AD9 32 .BYTE $32
1661 8ADA B2 .BYTE $B2
1662 8ADB 00 .BYTE $0
1663 8ADC 22 .BYTE $22
1664 8ADD 00 .BYTE $0
1665 8ADE 1A .BYTE $1A ;XXXYYY10 INSTRS.
1666 8ADF 1A .BYTE $1A
1667 8AE0 26 .BYTE $26
1668 8AE1 26 .BYTE $26 ;(WAS 0)
1669 8AE2 72 .BYTE $72
1670 8AE3 72 .BYTE $72
1671 8AE4 88 .BYTE $88
1672 8AE5 C8 .BYTE $C8
1673 8AE6 C4 .BYTE $C4
1674 8AE7 CA .BYTE $CA
1675 8AE8 26 .BYTE $26
1676 8AE9 48 .BYTE $48
1677 8AEA 44 .BYTE $44
1678 8AEB 44 .BYTE $44
1679 8AEC A2 .BYTE $A2
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 30-3
ALBUG.M65 6502 DISASSEMBLER
1680 8AED C8 .BYTE $C8
1681
LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 31
ALBUG.M65 6502 DISASSEMBLER
1683 ;SPECIAL SYMBOL TABLE
1684
1685 8AEE 2F